我一直在使用MassTransit来处理电子邮件。使用此代码:http://meandaspnet.blogspot.com/2009/10/how-to-binary-serialize-mailmessage-for.html我能够二进制序列化我的电子邮件并将它们发布到我的服务总线。它们也得到了正确的处理。
Bus.Initialize(
sbc =>
{
sbc.EnableMessageTracing();
sbc.ReceiveFrom("msmq://localhost/MyQueue");
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
sbc.UseMulticastSubscriptionClient();
sbc.UseBinarySerializer();
sbc.Subscribe(subs => subs.Instance(new MessageHandler()));
});
现在我添加了一个新类型和处理程序:
// Check out the sequence of the Consumes<> !
public class MessageHandler :
Consumes<SerializeableMailMessage>.All,
Consumes<AangifteOmzetbelasting>.All
{
public void Consume(AangifteOmzetbelasting message)
{
// Some code - method will NOT be called
}
public void Consume(SerializeableMailMessage mailMessage)
{
// Some code - this method is called by Mass Transit
}
}
奇怪的是,如果我发布SerializableMailMessage,这是有效的 - 但不适用于AangifteOmzetbelasting。如果我更改接口顺序 - 它适用于AangifteOmzetbelasting而不适用于SerializableMailMessage。像这样:
// Check out the sequence of the Consumes<> !
public class MessageHandler :
Consumes<AangifteOmzetbelasting>.All,
Consumes<SerializeableMailMessage>.All
在后一种情况下,SerializedMailMessges也不会出现在服务总线上。两者都使用以下方式发布:
Bus.Instance.Publish(object)
我在这里做错了什么?
答案 0 :(得分:2)
发布没有类型信息的消息是一场真正的斗争;类型信息对于路由非常重要。
我在这里看到的是,如果你必须发布为object
,我们是否有FastActivator帮助器,你可以看一下(应该在引用的Magnum库中)就像{{1} }。我可能有参数的顺序错误,但您需要方法名称,参数和泛型类型参数。
此外,如果您需要,我建议您加入MT邮件列表以进一步帮助解决此问题。 https://groups.google.com/forum/#!forum/masstransit-discuss