2012-02-17 39 views
2

我想使用NServiceBus從控制檯進程(非常類似於啓動NServiceBus.Host.exe庫中包含的PubSub示例)發送消息到我的WPF應用程序。NServiceBus - NServiceBus.Host作爲發佈者和WPF應用程序作爲訂閱者。如何?

這就是我所做的。 在WPF的App.xaml類我已經定義

public static IBus Bus; 

同一類,在application_startup處理:

Bus = Configure.With().DefaultBuilder().BinarySerializer() 
.MsmqTransport().IsTransactional(true).PurgeOnStartup(false) 
.UnicastBus().ImpersonateSender(false).LoadMessageHandlers() 
.CreateBus() 
.Start(); 

Bus.Subscribe<EventMessage>((message) => 
{ 
    switch (message.EventType) 
    { 
     case EventType.CreateSingleStay: 
      break; 
     case EventType.MoveToStartUpState: 
     case EventType.MoveToOperativeState: 
     case EventType.MoveToOutOfOrderState: 
      break; 
     case EventType.InputSignalDetected: 

      break; 
    } 
    return true; 
}); 

這是App.config中的WPF應用程序的:

<configSections> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
</configSections> 
<MsmqTransportConfig InputQueue="PresentationInputQueue" ErrorQueue="PresentationErrorQueue" NumberOfWorkerThreads="5" MaxRetries="5" /> 
<UnicastBusConfig> 
<MessageEndpointMappings> 
    <add Messages="PlusMatic.EventsTest" Endpoint="PlusMaticPublisherInputQueue" /> 
</MessageEndpointMappings> 
</UnicastBusConfig> 

然後,我NServiceBus.Host發佈者,非常簡單的c#類庫,它在調試時啓動NServiceBus.Host.exe可執行文件:

namespace PlusMatic.EventsTest 
{ 
    class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher { } 
} 

...

namespace PlusMatic.EventsTest 
{ 
public class TestPlusMaticServerEndpoint : IWantToRunAtStartup 
{ 
    public IBus Bus { get; set; } 
    private Thread _loopConsole; 

    #region Implementation of IWantToRunAtStartup 

    public void Run() 
    { 
     string readLine = string.Empty; 
     bool publishIEvent = true; 
     while (readLine != "j") 
     { 
      readLine = Console.ReadLine(); 
      var eventMessage = publishIEvent 
            ? Bus.CreateInstance<IEvent>() 
            : new EventMessage(); 
... 

      Bus.Publish(eventMessage); 

      Console.WriteLine("Published event with Id {0}.", eventMessage.EventId); 

      publishIEvent = !publishIEvent; 
     } 

    } 
    public void Stop() 
    { 

    } 
} 
} 

這我的事件類

namespace PlusMatic.EventsTest 
    { 
     [Serializable] 
     public class EventMessage : IEvent 
     { 
      public Guid EventId { get; set; } 
      public DateTime? Time { get; set; } 
      public EventType EventType { get; set; } 
      public MoveToStateEvent NextApplicationState { get; set; } 
      public InputEvent InputSignal { get; set; } 
      public IProductCard<Card> Card { get; set; } 
     } 
     public interface IEvent : IMessage 
     { 
      Guid EventId { get; set; } 
      DateTime? Time { get; set; } 
      IProductCard<Card> Card { get; set; } 
      EventType EventType { get; set; } 
      MoveToStateEvent NextApplicationState { get; set; } 
      InputEvent InputSignal { get; set; } 
     } 
    } 

的App.config在出版商:

<configSections> 
     <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
    </configSections> 

    <MsmqTransportConfig ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5"/> 

就是這樣。 沒有用。 我從控制檯項目發佈事件,並沒有發生在我的WPF應用程序。

也許我需要一些更多的實踐...;)

我使用NService總線3.0版本,至極是RC4版本,但我想這不是問題。

感謝任何人都可以幫忙!

L

+0

只是爲了說明我不認爲MsmqTransportConfig在NServiceBus 3中是有效的,我敢肯定你需要通過流暢的配置來做到這一點 – 2012-02-17 09:06:17

+0

終端'PlusMaticPublisherInputQueue'在發佈端定義在哪裏? – 2012-02-17 09:45:30

+0

如果使用NServiceBus.Integration配置文件啓動控制檯應用程序,您是否在輸入隊列中看到訂閱消息? – 2012-02-17 12:57:19

回答

0

發現問題。 我訂閱了一個「EventMessage」(它實現了「IEvent」 - >它實現了「IMessage」)併發布了一個「IEvent」!

相關問題