我遇到了一个奇怪的问题,即使用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" />
事件命名约定与服务相同。
答案 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
中