2016-12-06 15 views
1

我使用与Azure Service Bus相关的Rebus创建概念证明,但是我解析放置的消息时存在一些问题来自外部源的队列。Rebus Azure ServiceBus - 源自外部服务的消息缺少MessageID

我收到错误消息:

Received message with empty or absent 'rbs2-msg-id' header!

我已经通过GitHub上一看,发现某人怎么也有类似的问题,为的RabbitMQ此房源,并建议使用装饰:

https://github.com/rebus-org/Rebus/issues/508

但是我不确定如何为消息ID做到这一点。

一种选择我已经走了下来,实际上修改Rebus.AzureTransport代码来做到这一点:

var messageId = headers.GetValueOrNull(Headers.MessageId); 

if (string.IsNullOrEmpty(messageId)) 
{ 
    messageId = Guid.NewGuid().ToString(); 
    headers[Headers.MessageId] = messageId; 
} 

但宁愿替代!

我注意到另一件事,是一个BrokeredMessage被放在ASB这样的:

var message = new BrokeredMessage("<xml>This is a test message: " + DateTime.Now+ "</xml>"); 

它没有被正确序列化的卤面接收时。我得到以下错误:

Unhandled exception 1 while handling message with ID db13880d-124c-4ed5-993e-96faeca0f140: System.Collections.Generic.KeyNotFoundException: Could not find the key 'rbs2-content-type'

通过重写串行器,该underdying消息跨越如来:

@strin3http://schemas.microsoft.com/2003/10/Serialization/?6This is a test message: 06/12/2016 07:44:21

,所以我不知道我做错了。

在此先感谢。

回答

0

那么......正如错误消息所述,传入的消息没有包含足够的信息以便Rebus处理它。此外,Rebus的Azure服务总线传输要求将邮件内容作为Stream发送,以避免将包含的字节封装在XML结构中的成本(这是Azure服务总线驱动程序默认执行的操作) 。

如果我是你,我可能不会使用Rebus从不包含由Rebus发送的消息的队列接收消息。或者,我可能会这么做 - 但前提是传入的消息很容易适应Rebus格式。

虽然做到这一点可能有点麻烦,因为 - 正如您已经正确观察到的那样 - 它需要某些标题存在,这对Rebus提示如何在处理尝试之间跟踪它,如何反序列化,在这里回复,如果bus.Reply被调用,等等。所以我仍然可能最终没有这样做呢:)

我建议你做这样的事情:

while(true) 
{ 
    var message = GetNextMessageOrNullFromQueue(); 

    if (message == null) continue; 

    UnwrapMessageAndSendWithRebusToRebusQueue(message); 
} 

这样编码你自己接收循环以接收您的自定义格式的Azure服务总线消息,委托其实际处理(也可能将XML文本反序列化为对象?)到一个Rebus端点。

这通常是与外部事物集成的首选方式,因为它保持了在应用程序的外部和内部之间来回桥接的逻辑,而不是泄露到应用程序中。

+0

嗨,感谢您的回复。我将研究进行接收循环的可行性。有一件事我不确定,为什么当我覆盖序列化程序(我在你的ReceiveNonRebusMessageWithRabbitMq例子中使用了Utf8Fallback串行程序)时,会从队列中错误地选择消息。我会认为它会被正确解析? – jazzyuk

相关问题