我们尝试在基于ApacheCamel的系统(在Azure服务总线主题中生成消息)和这些消息的基于.NET的使用者之间构建基于事件的集成。
生产者使用服务总线的AMQP接口,而基于.NET的使用者则使用来自Microsoft的当前API(命名空间Azure.Messaging.ServiceBus
)。
当我们尝试访问接收到的消息中的正文时,如下所示:
private async Task ProcessMessagesAsync(ProcessMessageEventArgs args)
{
try {
message = Encoding.UTF8.GetString(args.Message.Body);
}
catch( Exception e)
{
_logger.LogError(e, "Body not decoded: Message: {@message}", e.Message);
}
_logger.LogInformation("Body Type: {@bodytype}, Content-Type: {@contenttype}, Message: {@message}, Properties: {@properties}", raw.Body.BodyType, args.Message.ContentType, message, args.Message.ApplicationProperties);
await args.CompleteMessageAsync(args.Message);
}
将引发以下异常:
Value cannot be retrieved using the Body property.Use GetRawAmqpMessage to access the underlying Amqp Message object.
System.NotSupportedException: Value cannot be retrieved using the Body property.Use GetRawAmqpMessage to access the underlying Amqp Message object.
at Azure.Messaging.ServiceBus.Amqp.AmqpMessageExtensions.GetBody(AmqpAnnotatedMessage message)
at Azure.Messaging.ServiceBus.ServiceBusReceivedMessage.get_Body()
当使用服务总线资源管理器查看主题时,消息看起来很奇怪:
@string3http://schemas.microsoft.com/2003/10/Serialization/�_{"metadata":{"version":"1.0.0","message_id":"AGHcNehoD-hK0pPJCSga9v9sXFwC","message_timestamp":"2022-01-10T13:34:32.778Z"},"data":{"source_timestamp":"2022-01-05T17:20:31.000","material":"101052"}}
当消息被发送到另一个带有.NET生成器的主题时,主题中会有一个纯文本JSON正文,正如所预期的那样。
有没有人成功地使用Azure Service Bus构建了一个解决方案,其中的组件基于上面提到的两个框架,是什么诀窍使互操作性发挥作用?Camel AMQP生产者可以使用BodyType
数据创建消息,以便消息主体可以由.NET Service Bus客户端库解码,而无需使用GetRawAmqpMessage
?
2条答案
按热度按时间vwhgwdsa1#
我无法说出Camel使用的是什么格式,但该错误消息指示您尝试解码的
Body
不是AMQP数据体,而这正是Service Bus客户端库使用和期望的。为了读取编码为AMQP值或序列的主体,需要使用AMQP格式的数据,而不是使用
ServiceBusReceivedMessage
便利层。为此,需要在ServiceBusReceivedMessage
上调用GetRawAmqpMessage
,它将给予一个AmqpAnnotatedMessage。带注解的消息
Body
属性将返回一个AmqpMessageBody示例,该示例允许您查询BodyType并使用AmqpMessageBody
上的TryGet
方法之一以数据的本机格式检索数据。rbpvctlc2#
当AMQP适配器的
Message Type
参数设置为Binary
时,在我们的生产商端使用SAP云集成,如下所示:https://help.sap.com/viewer/368c481cd6954bdfa5d0435479fd4eaf/Cloud/en-US/d5660c146a93483692335e9d79a8c58f.html。
这似乎对应于将Apache Camel
jmsMessageType
设置为Bytes
,有关详细信息,请参见https://camel.apache.org/components/3.14.x/amqp-component.html。ServiceBusReceivedMessage
中的正文解码按预期工作,并且BodyType
被设置为Data
。如果在生成器端使用Text
,则BodyType
将被设置为Value
,如前所述,这导致正文解码出现问题。