2012-03-23 96 views
1

我一直在使用MassTransit来处理电子邮件。使用此代码:http://meandaspnet.blogspot.com/2009/10/how-to-binary-serialize-mailmessage-for.html我可以将我的电子邮件序列化并将它们发布到我的服务总线。他们也正确处理。MassTransit二进制序列化消息处理不正确

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。如果我改变界面顺序 - 它适用于AangifteOmzetblasting,而不适用于SerializableMailMessage。像这样:

// Check out the sequence of the Consumes<> ! 
     public class MessageHandler : 
     Consumes<AangifteOmzetbelasting>.All, 
     Consumes<SerializeableMailMessage>.All 

在后一种情况下,SerializedMailMessges也不会出现在服务总线上。这两个使用发布:

Bus.Instance.Publish(object) 

我在做什么错在这里?

回答

2

发布消息没有类型信息是一个真正的斗争;类型信息对于路由非常重要。

如果您必须发布为object,我们会在这里看到的是,我们有FastActivator助手,您可以查看(应该在引用的Magnum库中),这将与Bus.Instance.FastActivator("Publish", message, { message.GetType() })类似。我可能有错误的参数顺序,但您需要方法名称,参数和泛型类型参数。

此外,如果您需要,我建议加入MT邮件列表以帮助解决此问题。 https://groups.google.com/forum/#!forum/masstransit-discuss

+0

感谢您的回复 - 我尝试使用Publish <>发布,但根据评论已过时。我不能更改我的发布方法来提供类型信息吗? – 2012-03-26 08:10:37

+0

我们使用两条总线来解决它:一条用于序列化消息,一条用于XML消息。 – 2012-03-27 11:07:04