基于Apache Camel的生产者和.NET使用者之间的Azure服务总线互操作性

1wnzp6jl  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(122)

我们尝试在基于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

vwhgwdsa

vwhgwdsa1#

我无法说出Camel使用的是什么格式,但该错误消息指示您尝试解码的Body不是AMQP数据体,而这正是Service Bus客户端库使用和期望的。
为了读取编码为AMQP值或序列的主体,需要使用AMQP格式的数据,而不是使用ServiceBusReceivedMessage便利层。为此,需要在ServiceBusReceivedMessage上调用GetRawAmqpMessage,它将给予一个AmqpAnnotatedMessage
带注解的消息Body属性将返回一个AmqpMessageBody示例,该示例允许您查询BodyType并使用AmqpMessageBody上的TryGet方法之一以数据的本机格式检索数据。

rbpvctlc

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,如前所述,这导致正文解码出现问题。

相关问题