2009-05-31 3 views
8

मैं एक कंसोल एप्लिकेशन को परिवर्तित करने के लिए ताकत/कमजोरियों के साथ विभिन्न तरीकों की तलाश में हूं, हम विंडोज़ सेवा में लंबी अवधि का उपयोग कर रहे हैं। हम ActiveMQ के लिए जावा सेवा रैपर नामक कुछ का उपयोग करते हैं, और मेरा मानना ​​है कि लोगों ने मुझे बताया है कि आप इसके साथ कुछ भी लपेट सकते हैं। यह नहीं कह रहा है कि आपको इसके साथ कुछ भी लपेटना चाहिए; हमारे पास इस सेटअप के साथ हमारे मुद्दे हैं।एक कंसोल एप्लिकेशन को किसी सेवा में कनवर्ट करना?

कंसोल ऐप एक .NET कंसोल एप्लिकेशन है जो डिफ़ॉल्ट रूप से कंसोल पर बहुत सारी जानकारी लॉग करता है, हालांकि यह कॉन्फ़िगर करने योग्य है।

कोई भी संशोधन?

क्या हमें इसे विजुअल स्टूडियो में सेवा के रूप में पुनर्निर्माण करना चाहिए? एक रैपर का प्रयोग करें? कौनसा?

उत्तर

11

मैं एक खाली विंडोज सेवा प्रोजेक्ट बनाने का लुत्फ उठाऊंगा, और बस सेवा से निपटने वाली बिट्स को पकड़ लें; यह बहुत कुछ नहीं है - Main में कुछ संदर्भ और कुछ कोड। वास्तव में आपके मौजूदा कंसोल का काम दोनों सेवा और कंसोल के रूप में हो सकता है - या तो Main पर तर्कों की जांच करके और (उदाहरण के लिए) "-कंसोल" स्विच का उपयोग करके, या मुझे विश्वास है कि आप Environment.UserInteractive देख सकते हैं।

यदि यह "कंसोल" मोड में है, अपने कोड के रूप में आप अब क्या चलाने; यदि यह सेवा मोड में है, तो टेम्पलेट प्रोजेक्ट से प्राप्त कोड चलाएं।

जानकारी के लिए, आप भी सेवा के लिए इंस्टॉलर/अनइंस्टॉलर के समान कार्य कर सकते हैं! मैं इसे "-install"/"-uninstall" स्विच के साथ करता हूं। उदाहरण के लिए, see here

0

कुछ विचार:

Create windows service with VS 2005

install .Net Service

मैं वर्षों से कुछ पहले लिखा था निष्पादनयोग्य के पर्ल आधारित सेट (theads) आदि, जो आपकी तरह अन्य आवश्यकताओं है लगता है .. ।

कुछ सामान को ध्यान में रखना:

    ,210
  • debuggin स्विच है (जब वास्तव में कुछ गलत हो जाता है यदि आपके पास होना चाहिए) दोनों कंसोल और फ़ाइलों (उदाहरण के लिए log4net कोशिश)
  • मन
  • में भविष्य regex पार्स के साथ अपने प्रवेश का निर्माण कर रहे हैं, तो करने के लिए
  • उत्पादन कुछ inderdependant प्रक्रियाओं, सीखें कि कैसे उन्हें मारने का, बंद करो और उन्हें
  • पुनः आरंभ करता है, तो वहाँ कुछ inderdependant प्रक्रियाओं उन्हें बातचीत करने के लिए

यहाँ log4net के साथ उत्पादन db से, फ़ाइल और कंसोल के लिए एक छोटा सा कंसोल उदाहरण है की कोशिश कर रहे हैं

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using log4net; 
    using log4net.Config; 
    using NUnit.Framework; 

    namespace ExampleConsoleApplication 
    { 
     [TestFixture] 
     class TestClass 
     { 

     //private static readonly ILog logger = 
     //  LogManager.GetLogger (typeof (TestClass)); 

     private static readonly log4net.ILog logger = log4net.LogManager.GetLogger (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

      static void Main (string[] args) 
      { 

       Console.WriteLine (" START "); 
       #region LoggerUsage 
       DOMConfigurator.Configure(); //tis configures the logger 
       logger.Debug ("Here is a debug log."); 
       logger.Info ("... and an Info log."); 
       logger.Warn ("... and a warning."); 
       logger.Error ("... and an error."); 
       logger.Fatal ("... and a fatal error."); 

       #endregion LoggerUsage 
       TestClass objTestClass = new TestClass(); 
       objTestClass.TestMethodNameOK(); 
       objTestClass.TestMethodNameNOK(); 

       Console.WriteLine (" END HIT A KEY TO EXIT "); 
       Console.ReadLine(); 
       } //eof method 

      [SetUp] 
      protected void SetUp() 
      { 
       //Add Here the Initialization of the objects 
      } 
      [Test (Description = "Add here the description of this test method ")] 
      protected void TestMethodNameOK() 
      { 
       //build ok use case scenario here - e.g. no exception should be raced ' 
       //Vegetable newCarrot = pool.GetItemByPropertyValue<Vegetable> ("WriongByPurpose", "Orange"); 
       //Assert.IsInstanceOfType (typeof (Vegetable), newCarrot); 
       //Assert.AreSame (newCarrot, carrot); 
       //logger.Info (" I got the newCarrot which is " + newCarrot.Color); 

      } //eof method 

      [Test (Description = "Add here the description of this test method ")] 
      protected void TestMethodNameNOK()   //e.g. the one that should raze Exception 
      { 
       //build ok use case scenario here - e.g. no exception should be raced ' 
       //Vegetable newCarrot = pool.GetItemByPropertyValue<Vegetable> ("WriongByPurpose", "Orange"); 
       //Assert.IsInstanceOfType (typeof (Vegetable), newCarrot); 
       //Assert.AreSame (newCarrot, carrot); 
       //logger.Info (" I got the newCarrot which is " + newCarrot.Color); 

      } //eof method 

     } //eof class 

    } //eof namespace 





    #region TheAppConfig 
// <?xml version="1.0" encoding="utf-8" ?> 
//<configuration> 
// <configSections> 
// <section name="log4net" 
//   type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
// </configSections> 

// <log4net> 
// <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
//  <param name="File" value="Program.log" /> 
//  <param name="AppendToFile" value="true" /> 
//  <layout type="log4net.Layout.PatternLayout"> 
//  <!--<param name="Header" value="======================================" /> 
//  <param name="Footer" value="======================================" />--> 
//  <param name="ConversionPattern" value="%d [%t] %-5p - %m%n" /> 
//  </layout> 
// </appender> 

// <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 
//  <mapping> 
//  <level value="ERROR" /> 
//  <foreColor value="Red" /> 
//  </mapping> 
//  <mapping> 
//  <level value="DEBUG" /> 
//  <foreColor value="HighIntensity" /> 
//  </mapping> 
//  <mapping> 
//  <level value="INFO" /> 
//  <foreColor value="Green" /> 
//  </mapping> 
//  <mapping> 
//  <level value="WARN" /> 
//  <foreColor value="Yellow" /> 
//  </mapping> 
//  <mapping> 
//  <level value="FATAL" /> 
//  <foreColor value="White" /> 
//  <backColor value="Red" /> 
//  </mapping> 

//  <layout type="log4net.Layout.PatternLayout"> 
//  <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
//  </layout> 
// </appender> 


// <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
//  <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.2.10.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
//  <connectionString value="data source=ysg;initial catalog=DBGA_DEV;integrated security=true;persist security info=True;" /> 
//  <commandText value="INSERT INTO [DBGA_DEV].[ga].[tb_Data_Log] ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" /> 

//  <parameter> 
//  <parameterName value="@log_date" /> 
//  <dbType value="DateTime" /> 
//  <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'.'MM'.'dd HH':'mm':'ss'.'fff}" /> 
//  </parameter> 
//  <parameter> 
//  <parameterName value="@thread" /> 
//  <dbType value="String" /> 
//  <size value="255" /> 
//  <layout type="log4net.Layout.PatternLayout" value="%thread" /> 
//  </parameter> 
//  <parameter> 
//  <parameterName value="@domainName" /> 
//  <dbType value="String" /> 
//  <size value="255" /> 
//  <layout type="log4net.Layout.PatternLayout" value="%user" /> 
//  </parameter> 
//  <parameter> 
//  <parameterName value="@log_level" /> 
//  <dbType value="String" /> 
//  <size value="50" /> 
//  <layout type="log4net.Layout.PatternLayout" value="%level" /> 
//  </parameter> 
//  <parameter> 
//  <parameterName value="@logger" /> 
//  <dbType value="String" /> 
//  <size value="255" /> 
//  <layout type="log4net.Layout.PatternLayout" value="%logger" /> 
//  </parameter> 
//  <parameter> 
//  <parameterName value="@message" /> 
//  <dbType value="String" /> 
//  <size value="4000" /> 
//  <layout type="log4net.Layout.PatternLayout" value="%message" /> 
//  </parameter> 
// </appender> 
// <root> 
//  <level value="ALL" /> 
//  <appender-ref ref="LogFileAppender" /> 
//  <appender-ref ref="AdoNetAppender" /> 
//  <appender-ref ref="ColoredConsoleAppender" /> 
// </root> 
// </log4net> 
//</configuration> 
    #endregion TheAppconfig 

    //this is the xml added replace here your log4net and Nunit paths 
    //<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL"> 
    // <SpecificVersion>False</SpecificVersion> 
    // <HintPath>..\..\..\Log4Net\log4net-1.2.10\bin\net\2.0\release\log4net.dll</HintPath> 
    //</Reference> 
    //<Reference Include="nunit.framework, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" /> 
2

Vici WinService एक कंसोल ऐप को एक स्व-स्थापित विंडोज सेवा में बदल देगा। यह ओपन-सोर्स है और आप सोर्स कोड डाउनलोड कर सकते हैं। यहां तक ​​कि यदि आप लाइब्रेरी का उपयोग नहीं करना चाहते हैं, तो भी आप इससे कुछ विचार प्राप्त कर सकते हैं।

0

आपका दीर्घकालिक उपयोग परिदृश्य क्या है? एक विंडोज सेवा पर्याप्त हो सकती है ... लेकिन विंडोज सर्वर 2008/आईआईएस 7 विंडोज सक्रियण सेवाओं के माध्यम से "सेवाओं" को होस्ट करने और सक्रिय करने के कुछ दिलचस्प नए तरीके प्रदान करता है। एक विंडोज सेवा हमेशा चल रही है, और कुछ विशेष कोडिंग की आवश्यकता हो सकती है। डब्ल्यूएएस के साथ, आप अपने मेजबान को एक सामान्य डब्ल्यूसीएफ सेवा के रूप में लिख सकते हैं, और जब अनुरोध में आते हैं तो इसे मांग पर सक्रिय किया जाता है, और इसका उपयोग नहीं किया जाता है। अन्य विकल्प भी मौजूद हैं ... जैसे एमएसएमक्यू होस्टिंग और इंस्टेंटेशन इत्यादि।

0

मैं इस एक ही मुद्दे में भाग गया, मैं अपने खुद के आवरण लेखन समाप्त हो गया है, यह सबसे सरल परिस्थितियों के लिए केवल अच्छा है, लेकिन यह यह सुविधाओं है। आप यहां उपकरण ढूंढ सकते हैं: http://runasservice.com। भत्ते के कुछ तथ्य यह है कि आप एक सांत्वना आवेदन जो परीक्षण करने और आईडीई में चलाने के लिए आसान है के रूप में अपने आवेदन कोड कर सकते हैं शामिल हैं। इसे एक सेवा में सेट करना एक साधारण कमांड शामिल है ताकि आपको अपना एप्लिकेशन संपादित करने की आवश्यकता न हो। साथ ही आप विभिन्न नामों के साथ कई बार सेवा स्थापित कर सकते हैं, जो आप करना चाहते हैं यदि आप प्रत्येक को अलग-अलग पैरामीटर के साथ चलाने के लिए चाहते हैं।

जैसा कि मैंने कहा, हालांकि यह केवल सरल परिदृश्यों, अनुप्रयोग जो पहले से ही अनिवार्य रूप से सेवाएं हैं को शामिल किया गया है। वह लगातार चल रहा है। मुझे यकीन है कि वहां कई अन्य सेवाएं हैं जो आपको बहुत अधिक विकल्प देती हैं।

व्यक्तिगत तौर पर मैं यह विशेष रूप से कठिन है एक सांत्वना आवेदन कन्वर्ट करने के लिए नहीं लगता है, लेकिन यह परीक्षण करने के लिए एक परेशानी हो सकती है। अंत में यह इस बात पर निर्भर करता है कि आप कितना नियंत्रण चाहते हैं। यदि यह आपकी कंपनी के लिए वास्तव में एक महत्वपूर्ण सेवा है, तो मैं इसे कन्वर्ट कहूंगा।