2012-09-05 20 views
5

मैं NServiceBus के लिए नया हूं और एक प्रकाशक और अलग ग्राहक (मैं v3.2.0.0 का उपयोग कर रहा हूं) विकसित करने की कोशिश कर रहा हूं, जो अब तक काम कर रहा है ठीक है - प्रकाशक और ग्राहक दोनों NServiceBus होस्ट में चल रहे हैं। मेरे संदेशों सब ठीक प्रकाशित लेकिन रुक-रुक कर वे निम्न त्रुटि प्रकाशक द्वारा प्रदर्शित किया जा रहा के साथ ग्राहक द्वारा उठाया नहीं मिलता,:NServiceBus चेतावनी "संदेश प्रकार के लिए कोई हैंडलर नहीं मिल सका"

2012-09-05 14:27:37,491 [Worker.6] WARN NServiceBus.Unicast.UnicastBus [(null)] <(null)> - No handlers could be found for message type: MyNamespace.MyMessage 

यह चेतावनी है, हालांकि सभी संदेशों के लिए प्रकट नहीं होता है, इसलिए यदि मैं प्रकाशन रखना संदेश के बाद संदेश मैं उनमें से आधे संदेश को प्रदर्शित कर सकता हूं और इसलिए ग्राहक द्वारा उठाया नहीं जा रहा है, हालांकि सभी एमएसएमक्यू कतार में दिखाई दे रहे हैं।

मैं स्वीकार करूंगा कि मैं इसके साथ पकड़ने के लिए संघर्ष कर रहा हूं, इसलिए मेरा कुछ कोड अब तक पूरी तरह से बकवास हो सकता है!

मैं एन एस बी करने के लिए संदेश का प्रकाशन कर रहा हूँ के रूप में निम्नानुसार, संदेश इनपुट विभिन्न प्रकार में से एक मैं परिभाषित किया है होने के साथ:

इस प्रकार
private void Publish<T>(T message) 
{ 
    var myBus = Configure.Instance.Builder.Build<IBus>(); 
    myBus.Publish(message); 
} 

प्रकाशक की EndpointConfig है के रूप में:

[EndpointName("MyQueue")] 
public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher, IWantCustomInitialization 
{ 
    /// <summary> 
    /// Initialisation for NServiceBus. 
    /// </summary> 
    public void Init() 
    { 
     Configure.With() 
      .DefaultBuilder() 
      .MsmqSubscriptionStorage() 
      .DisableTimeoutManager() 
      .DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("MyNamespace")); 
    } 
} 

ग्राहक पक्ष पर मेरे पास निम्न एंडपॉइंट कॉन्फ़िग है:

[EndpointName("MyQueue")] 
public class EndPointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization 
{ 
    public void Init() 
    { 
     Configure.With() 
      .DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("MyNamespace")); 
    } 
} 

एक EventMessageHandler के साथ इस प्रकार है:

public class EventMessageHandler : IEvent, IHandleMessages<IMyMessage> 
{ 
    public void Handle(IMyMessage message) 
    { 
     Console.WriteLine(string.Format("Subscriber 1 received EventMessage with Id {0}.", message.Id)); 
    } 
} 

ग्राहक के app.config है:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
    <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" /> 
    </configSections> 

    <MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/> 

    <UnicastBusConfig> 
    <MessageEndpointMappings> 
     <add Messages="MyNamespace" Endpoint="MyQueue" /> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 
</configuration> 

उत्तर

8

ऐसा लगता है कि दोनों अपने प्रकाशक और अपने ग्राहक के लिए एक ही endpoint नाम का उपयोग कर रहे हैं। NServiceBus कतार नाम उत्पन्न करने के लिए एंडपॉइंट नाम का उपयोग करता है, इसका मतलब है कि दोनों प्रक्रियाएं एक ही कतार का उपयोग करके हवाएं बनती हैं।

तो असल में आपका प्रकाशक संदेश प्रकाशित कर रहा है, लेकिन फिर प्रकाशक और ग्राहक उन पर लड़ रहे हैं जो उन्हें संसाधित करते हैं।

जब ग्राहक जीतता है, तो आप अपना इच्छित व्यवहार देखते हैं।

जब प्रकाशक जीता है, तो उस संदेश के लिए कोई हैंडलर नहीं है, इसलिए NServiceBus एक चेतावनी प्रदर्शित करता है। यह हमेशा एक समस्या नहीं है; ऐसे कुछ परिदृश्य हैं जहां आप प्राप्त करना चाहते हैं और केवल एक संदेश को अनदेखा करना चाहते हैं, लेकिन यह चेतावनी आपको कम से कम यह जानती है कि यह घटित हो रहा है, और आपके मामले में, यह कह रहा है कि संदेश को इच्छित एप्लिकेशन द्वारा संसाधित नहीं किया जा रहा है।

तो इसे ठीक करने के लिए, बस एंडपॉइंट नाम बदलें। MySubscriber और MyPublisher, या ऐसा कुछ।

आपको उस विशेषता का उपयोग करने की भी आवश्यकता नहीं है, तो आप उस श्रेणी का नाम दे सकते हैं जो IConfigureThisEndpoint लागू करता है और NServiceBus उस पर आधारित एंडपॉइंट नाम का निर्माण करेगा। आप MyProject_MyPublisher : IConfigureThisEndpoint जैसे अंडरस्कोर का भी उपयोग कर सकते हैं और NServiceBus अंडरस्कोर को डॉट्स में बदल देगा, इसलिए आपको "MyProject.MyPublisher" की एक इनपुट कतार मिलेगी, जो नामांकन के लिए वास्तव में अच्छा है जब आपके पास कई अंतराल चल रहे हैं।

+0

धन्यवाद डेविड, मैंने गलत तरीके से माना था कि सही बिंदु पर ग्राहक को इंगित करने के लिए एंडपॉइंट समान होना था, लेकिन आपने जो कहा है वह समझ में आता है।मुझे अभी भी प्रकाशक से चेतावनी संदेश मिलता है (अब प्रत्येक संदेश के लिए), लेकिन सभी संदेशों को ग्राहक द्वारा उठाया जा रहा है, इसलिए मैं उससे खुश हूं। धन्यवाद :) – RichardB

+0

वास्तव में, अभी भी दिखाई देने वाली चेतावनियों के बारे में मेरी टिप्पणी को अनदेखा करें - मैंने MyQueue में सभी संदेशों को साफ़ कर दिया है। सदस्यताएं (वहां 3 थीं) और अब यह पूरी तरह से काम कर रही है। – RichardB

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

  • कोई संबंधित समस्या नहीं^_^