没有为消息指定目标,但我的NServiceBus配置似乎正确设置

时间:2012-03-03 16:25:42

标签: c# nservicebus

我创建了一个标准的NServiceBus发布订阅程序。向发布商NServicBus主机发送消息时,我一直收到以下错误:

没有为消息TrackEventPublisher.TrackEventPublisher.InternalMessages.TrackEventMessages指定目标。消息无法发送。检查配置文件中的UnicastBusConfig部分,并确保消息类型存在MessageEndpointMapping。

嗯...... MessageEndpointMapping存在!

这是我用来测试MessagePublisher类的测试控制台应用程序代码:

class Program
   {
      static void Main(string[] args)
      {
         Console.WriteLine("Click enter to submit message.");
         Console.ReadLine();

         string aMessage = "Please Work!!!!!!!!";
         MessagePublisher publisher = new MessagePublisher();
         publisher.PublishEventMessage(aMessage);
      }
   }

这是我的消息发送者类,它将消息发送到另一个要发布的NServiceBus发布服务器:

   public class MessagePublisher
   {
      public IBus Bus { get; set; }

      public MessagePublisher()
      {
         BusInitializer.Init();
         Bus = BusInitializer.Bus;
      }

      public void PublishEventMessage(string message)
      {
         Bus.Send(new TrackEventMessages(message));
      } 
   }

我的总线初始化程序:

   class BusInitializer
   {
      public static IBus Bus { get; private set; }

      public static void Init()
      {
         Bus = NServiceBus.Configure.With()
             .Log4Net()
             .DefaultBuilder()
             .XmlSerializer()
             .MsmqTransport()
                 .IsTransactional(false)
                 .PurgeOnStartup(false)
             .UnicastBus()
                 .LoadMessageHandlers()
                 .ImpersonateSender(false)
             .CreateBus()
             .Start();
      }
   }

我的留言课:

namespace TrackEventPublisher.TrackEventPublisher.InternalMessages
{
    public class TrackEventMessages : IMessage
    {
       public string HelloWorldMessage { get; set; }

       public TrackEventMessages(string message)
       {
          HelloWorldMessage = message;
       }
    }
}

最后,我对消息发布者的配置:

namespace TrackEventPublisher.PublishManager
{
    public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
    {
    }
}

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

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

  <UnicastBusConfig ForwardReceivedMessagesTo="">
    <MessageEndpointMappings>
      <add Messages="TrackEventPublisher.TrackEventPublisher.InternalMessages" Endpoint="TrackEventPublisher" />
    </MessageEndpointMappings>
  </UnicastBusConfig>
</configuration>

配置由NServiceBus自动生成器创建。配置似乎是正确的。有没有人知道为什么我通过以下方式获取InvalidOperationException“没有为消息指定目的地”:

    Bus.Send(new TrackEventMessages(message));

提前致谢。我花了太多时间在这个上。

*更新 * *

我可能在MessagePubliser类中错误地设置了总线。我的目标是从另一个应用程序(wpf,控制台等)实例化MessagePublisher类。这就是我使用BusInitializer类的原因。但是,我创建的总线与MessagePublisher类中的app.config无关 有没有人知道如何实例化MessagePublisher类,以便我的总线识别app.config?也许使用IWantToRunAtStartup?

1 个答案:

答案 0 :(得分:1)

我们的想法是使用WPF应用程序初始化总线并将信息发送给发布者主机。我观看了Udi的pub / sub演示视频(请参阅NServiceBus网站进行在线培训),该视频描述了使用仅发送NServiceBus主机作为Web应用程序向发布者发送消息。我使用WPF应用程序而不是Web应用程序,它就像一个魅力。

以下是我的应用程序中可能有助于其他人的一些代码。

App.Config中:

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

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

  <UnicastBusConfig ForwardReceivedMessagesTo="">
    <MessageEndpointMappings>
      <add Messages="TrackEventPublisher.EventPublisher.InternalMessages" Endpoint="EventPublisher" />
    </MessageEndpointMappings>
  </UnicastBusConfig>
</configuration>

App.xaml.cs:

public partial class App : Application
{
  public static IBus Bus { get; private set; }

  protected override void OnStartup(StartupEventArgs e)
  {
     base.OnStartup(e);

     Bus = NServiceBus.Configure.With()
         .DefineEndpointName("DemoExecutive")
         .Log4Net()
         .DefaultBuilder()
         .XmlSerializer()
         .MsmqTransport()
             .IsTransactional(false)
             .PurgeOnStartup(false)
         .UnicastBus()
             .ImpersonateSender(false)
         .CreateBus()
         .Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
  }
}

MainWindow.xaml.cs :(注意:您使用App.Bus.Send()发送消息。)

  private void button1_Click(object sender, RoutedEventArgs e)
  {
     const long aNumber = 999999;
     var eventWhen = DateTime.Now;
     const string eventWhere = "Generic Kitchen";
     const string eventType = "Breakfast";
     const string aStatus = "Broken Toaster";

     var genericEventMessage = new GenericEventMessage
                                                  {
                                                     Number = aNumber,
                                                     EventWhen = eventWhen,
                                                     EventWhere = eventWhere,
                                                     EventType = eventType,
                                                     Status = aStatus
                                                  };

     App.Bus.Send(new TrackEventMesage(genericEventMessage));
  }

对不起,我这么晚才发布答案安德烈亚斯。我去看看我多久回顾一下我的帖子。 :)