2011-10-03 13 views
10

एक csharp-example और विधिवत के साथ शुरू सवाल (Restart a windows services from C# और Cannot restart a Service) और विभिन्न अन्य प्रश्न से संबंधित सिर्फ एक सेवा को पुन: प्रारंभ अतः संबंधित पर ध्यान देते हुए मैं सोच रहा हूँ के लिए क्या सबसे अच्छा तरीका है निर्भर सेवाएं के साथ एक सेवा को पुन: प्रारंभ (उदाहरण के लिए Message Queuing, जिस पर Message Queuing Triggers निर्भर करता है, या IIS, जिस पर FTP Publishing और World Wide Web Publishing निर्भर करता है)। एमएमसी स्नैप-इन यह स्वचालित रूप से करता है, लेकिन कोड समान कार्यक्षमता प्रदान नहीं करता है (कम से कम आसानी से नहीं)।आश्रित सेवाओं के साथ एक सेवा पुनरारंभ करें?

MSDN documentation for Stop कहते हैं, "किसी भी सेवा के लिए अपने ऑपरेशन के लिए इस सेवा का उपयोग करते हैं तो वे बंद कर दिया जाएगा से पहले इस सेवा को बंद कर दिया गया है। DependentServices संपत्ति सेवाओं है कि इस पर निर्भर करती है की सेट होता है," और DependentServices सेवाओं की एक सरणी देता है । मान लिया जाये कि StartService() और StopService() सम्मेलनों उदाहरण और में उल्लिखित निर्देशों का पालन इस तरह के ऊपर (सिवाय इसके कि वे ServiceControllers और TimeSpans स्वीकार सीधे), मैं के साथ शुरू किया संदर्भित:

public static void RestartServiceWithDependents(ServiceController service, TimeSpan timeout) 
{ 
    ServiceController[] dependentServices = service.DependentServices; 

    RestartService(service, timeout); // will stop dependent services, see note below* about timeout... 

    foreach (ServiceController dependentService in dependentServices) 
    { 
     StartService(dependentService, timeout); 
    } 
} 

लेकिन सेवा निर्भरता नेस्टेड रहते हैं क्या हुआ अगर (पुनरावर्ती) या चक्रीय (यदि यह भी संभव है ...) - अगर Service A है Service B1 और Service B2 और Service C1Service B1 पर निर्भर करता है के द्वारा पर निर्भर, ऐसा लगता है 'को पुन: प्रारंभ' इस विधि द्वारा Service Aबंद कर देंगे 210 लेकिन यह पुनः आरंभ नहीं होता ...

इस उदाहरण चित्र स्पष्ट बनाने के लिए, मैं सेवाओं एमएमसी में मॉडल का पालन करेंगे स्नैप-इन:

The following system components depend on [Service A]: 
    - Service B1 
    - Service C1 
    - Service B2 

वहाँ के बारे में जाने के लिए एक बेहतर तरीका है यह, या क्या इसे केवल प्रत्येक आश्रित सेवा में कदम उठाना और रोकना होगा और फिर मुख्य सेवा को पुनरारंभ करने के बाद उन सभी को पुनरारंभ करना होगा?

साथ ही, निर्भर लेकिन वर्तमान में बंद कर दिया जाएगा सेवाओं DependentServices के अंतर्गत सूचीबद्ध किया? यदि हां, तो क्या यह उन्हें फिर से शुरू नहीं करेगा? यदि हां, तो क्या हमें इसे भी नियंत्रित करना चाहिए? यह सिर्फ गड़बड़ और गड़बड़ हो रहा है ...

* नोट: मुझे एहसास है कि timeout पूरी तरह से सही ढंग से लागू नहीं किया जा रहा है (समग्र टाइमआउट अपेक्षा से कई गुना अधिक हो सकता है), लेकिन अब यह मुद्दा नहीं है मुझे चिंता है - अगर आप इसे ठीक करना चाहते हैं, ठीक है, लेकिन केवल 'टाइमआउट टूटा हुआ नहीं है ...'

अपडेट: कुछ प्रारंभिक परीक्षण के बाद, मैंने (/ पुष्टि) की खोज की है निम्नलिखित व्यवहार:

  • सेवा रोकना (उदाहरण के लिए Service A) कि अन्य सेवाएं (ई .g। Service B1) पर निर्भर अन्य सेवाओं ("नेस्टेड" इस तरह के Service C1 रूप निर्भरता)
  • DependentServices (चल रहा है, रूका, आदि) सभी राज्यों में निर्भर सेवाओं में शामिल करता है सहित बंद हो जाएगा, और यह भी नेस्टेड निर्भरता है, यानी शामिलService_A.DependentServices में {Service B1, Service C1, Service B2} होगा (उस क्रम में, C1B1 पर निर्भर करता है)।
  • किसी सेवा को शुरू करना जो दूसरों पर निर्भर करता है (उदा। Service B1Service A पर निर्भर करता है) आवश्यक सेवाओं को भी शुरू करेगा।

कोड ऊपर इसलिए सरल किया जा सकता (कम से कम आंशिक रूप से) सिर्फ मुख्य सेवा (जो सभी निर्भर सेवाएं बंद हो जाएगा) और फिर बंद करने के लिए सबसे निर्भर सेवाओं (जैसे Service C1 और Service B2) को पुन: प्रारंभ (या बस "सभी" निर्भर सेवाओं को पुनरारंभ करना - यह पहले से शुरू किए गए लोगों को छोड़ देगा), लेकिन यह वास्तव में केवल तब तक मुख्य सेवा की शुरुआत को रोकता है जब तक निर्भरताओं में से कोई इसकी शिकायत नहीं करता है, जिससे वास्तव में मदद नहीं मिलती है।

सिर्फ सबसे आसान तरीका सभी निर्भरता को पुन: प्रारंभ कर रहा है की तरह अब के लिए लग रहा है, लेकिन वह (अब के लिए) पर ध्यान नहीं देता सेवाओं है कि पहले से ही कर रहे हैं प्रबंध बंद कर दिया और इस तरह के ...

उत्तर

संबंधित मुद्दे