无法在NServiceBus中发布事件 - 消息类型无法通过' Type.GetType'确定,扫描已知消息以查找匹配项

时间:2015-11-20 12:33:48

标签: nservicebus msmq

我遇到了一个奇怪的问题,即使用NServiceBus向MSMQ发布事件。我可以使用IBus.Send方法成功发送消息(我可以在MSMQ中找到已发送的消息)。但是,当我尝试使用IBus.Publish方法发布事件时,消息不会到达MSMQ。对于每个已发布的消息,我只收到以下日志消息。

[DEBUG] 2015-11-20 13:19:43.9444 Message type: 'MyAssembly.Messages.NewEmailEvent' could not be determined by a 'Type.GetType', scanning known messages for a match 

事件定义如下所示。

namespace MyAssembly.Messages
{
    public class NewEmailEvent
    {
        public Guid MessageId { get; set; }
        public string Subject { get; set; }
        public string Sender { get; set; }
        // a few other fields
    }
}

我使用以下代码发布活动。

m_Bus.Publish<NewEmailEvent>(msg => {
    msg.MessageId = entry.MessageId;
    msg.Subject = entry.Email.Subject;
    msg.Sender = entry.Email.Sender.Name;
    // more property assignments
});

我有以下路由配置。

<MsmqTransportConfig InputQueue="Nsb_input" ErrorQueue="Nsb_errors" NumberOfWorkerThreads="1" MaxRetries="5" />
<MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />
<UnicastBusConfig>
  <MessageEndpointMappings>
    <add Assembly="MyAssembly.Messages" Endpoint="NServiceBus.Service" />
  </MessageEndpointMappings>
</UnicastBusConfig>

事件命名约定在代码中定义如下。

busConfiguration.Conventions().DefiningEventsAs(
    t => t.Assembly.GetName().Name.EndsWith(".Messages", StringComparison.InvariantCulture)
        && t.Name.EndsWith("Event", StringComparison.InvariantCulture));

在启动时正确注册了消息。

[DEBUG] 2015-11-20 13:18:35.1345 Message definitions: 
MessageType: MyAssembly.Messages.NewEmailEvent, Recoverable: True, TimeToBeReceived: Not set , Parent types: MyAssembly.Messages.NewEmailEvent
MessageType: NServiceBus.Scheduling.Messages.ScheduledTask, Recoverable: True, TimeToBeReceived: Not set , Parent types: NServiceBus.Scheduling.Messages.ScheduledTask

在接收端,我使用以下代码订阅该活动。

bus.Subscribe<NewEmailEvent>();

并使用以下配置。

<UnicastBusConfig>
  <MessageEndpointMappings>
    <add Assembly="MyAssembly.Messages" Endpoint="NServiceBus.Service" />
  </MessageEndpointMappings>
</UnicastBusConfig>
<MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />

事件命名约定与服务相同。

1 个答案:

答案 0 :(得分:0)

您的 MessageEndpointMappings 对于发布商和订阅者都是相同的 - 不知道这是否正确/有所作为。

您尚未定义任何消息或命令约定;只有活动。

busConfiguration.Conventions()
    .DefiningMessagesAs(t => t.Namespace != null &&
                         t.Namespace.StartsWith("MyAssembly.Messages"))
    .DefiningCommandsAs(t => t.Namespace != null &&
                         t.Namespace.StartsWith("MyAssembly.Commands"))

如果您不使用marker interfaces,我认为您需要这样做。

我认为这在订阅者中尤为重要。

您尚未包含订阅者的代码。它是否有一个实现 IHandleMessages&lt; NewEmailEvent&gt; 的类?

返回并查看pub/sub example

再次检查配置设置。它看起来并不像您使用外部文件;这些部分直接在app.config