无法在NServiceBus中发布事件-消息类型无法由';Type.GetType';,扫描已知消息以查找匹配项
我在使用NServiceBus将事件发布到MSMQ时遇到了一个奇怪的问题。我可以使用无法在NServiceBus中发布事件-消息类型无法由';Type.GetType';,扫描已知消息以查找匹配项,nservicebus,msmq,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
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
});
bus.Subscribe<NewEmailEvent>();
消息在启动时已正确注册
[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
在接收端,我使用以下代码订阅事件
m_Bus.Publish<NewEmailEvent>(msg => {
msg.MessageId = entry.MessageId;
msg.Subject = entry.Email.Subject;
msg.Sender = entry.Email.Sender.Name;
// more property assignments
});
bus.Subscribe<NewEmailEvent>();
bus.Subscribe();
并使用以下配置
<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>
<UnicastBusConfig>
<MessageEndpointMappings>
<add Assembly="MyAssembly.Messages" Endpoint="NServiceBus.Service" />
</MessageEndpointMappings>
</UnicastBusConfig>
<MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />
事件命名约定与服务相同。您的MessageEndpointMappings对于发布者和订阅者都是相同的-不知道这是否正确/是否有区别
您尚未定义任何消息或命令约定;只有事件
busConfiguration.Conventions()
.DefiningMessagesAs(t => t.Namespace != null &&
t.Namespace.StartsWith("MyAssembly.Messages"))
.DefiningCommandsAs(t => t.Namespace != null &&
t.Namespace.StartsWith("MyAssembly.Commands"))
我认为如果你不使用,你需要这样做
我认为这在订户中尤其重要
您尚未包括您的订户的代码。它是否有一个实现IHandleMessages的类
回去看看这张照片
再次检查配置设置。看起来你没有使用外部文件;这些部分直接在app.config中您的MessageEndpointMappings对于发布者和订阅者都是相同的-不知道这是否正确/是否有区别
您尚未定义任何消息或命令约定;只有事件
busConfiguration.Conventions()
.DefiningMessagesAs(t => t.Namespace != null &&
t.Namespace.StartsWith("MyAssembly.Messages"))
.DefiningCommandsAs(t => t.Namespace != null &&
t.Namespace.StartsWith("MyAssembly.Commands"))
我认为如果你不使用,你需要这样做
我认为这在订户中尤其重要
您尚未包括您的订户的代码。它是否有一个实现IHandleMessages的类
回去看看这张照片
再次检查配置设置。看起来你没有使用外部文件;这些部分直接位于app.config中。您能展示您订阅的代码是什么样子吗?我用订阅应用程序的源代码和配置更新了我的问题。在“NServiceBus.Service”端点上是什么?我想说的是,你需要将订阅端的MessageEndpointMappings改为指向Nsb_输入。你解决问题了吗?消息约定是否同时应用于发布服务器和订阅服务器?它们是否相同?“NServiceBus.Service”是发送事件的应用程序的终结点(终结点名称是使用
BusConfiguration.EndpointName
设置的)。将订户端的MessageEndpointMappings更改为Nsb_输入后,我得到一个错误,即队列不存在。事实上,它并不存在。另一方面,nservicebus.service队列存在(nservicebus在启动时创建了它)。你能展示你订阅的代码是什么样子吗?我用源代码和订阅应用程序的配置更新了我的问题。“nservicebus.service”端点上是什么?我想说的是,你需要将订阅端的MessageEndpointMappings改为指向Nsb_输入。你解决问题了吗?消息约定是否同时应用于发布服务器和订阅服务器?它们是否相同?“NServiceBus.Service”是发送事件的应用程序的终结点(终结点名称是使用BusConfiguration.EndpointName
设置的)。将订户端的MessageEndpointMappings更改为Nsb_输入后,我得到一个错误,即队列不存在。事实上,它并不存在。另一方面,存在nservicebus.service队列(nservicebus在启动时创建了它)。我对消息和命令的约定与对事件的约定类似。唯一的区别是,它们以“消息”和“命令”结束,而不是以“事件”结束。我只发布了事件的约定,以尽可能地缩短帖子。我在另一个应用程序中将处理程序作为一个公共类,它实现了IHandleMessages
。然而,即使没有处理程序,我也不明白为什么事件没有在MSMQ中排队。当我发送消息而不是事件时,它们确实到达MSMQ。“消息”和“命令”-单数还是复数?我想几个月前我也遇到过类似的问题,结果证明公约很重要(即使用“信息”,而不是“信息”或完全像我最初那样的其他东西)。我可能只是记错了,但这不需要花很多时间来验证。>>>我在另一个应用程序中有处理程序。我对消息和命令的约定与对事件的约定类似。唯一的区别是,它们以“消息”和“命令”结束,而不是以“事件”结束。我只发布了事件的约定,以尽可能地缩短帖子。我在另一个应用程序中将处理程序作为一个公共类,它实现了IHandleMessages
。然而,即使没有处理程序,我也不明白为什么事件没有在MSMQ中排队。当我发送消息而不是事件时,它们确实到达MSMQ。“消息”和“命令”-单数还是复数?我想几个月前我也遇到过类似的问题,结果证明公约很重要(即使用“信息”,而不是“信息”或完全像我最初那样的其他东西)。我可能只是记错了,但这不需要花很多时间来验证。>>>我在另一个应用程序中有这个处理程序