将消息发送到 Azure 事件中心主题时添加到标头的垃圾值

问题描述

我正在向 Azure 事件中心发送一条消息,但收到的消息在标头值的开头包含“�$”。 代码:

import com.azure.core.credential.TokenCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.messaging.eventhubs.EventData;
import com.azure.messaging.eventhubs.EventDataBatch;
import com.azure.messaging.eventhubs.EventHubClientBuilder;
import com.azure.messaging.eventhubs.EventHubProducerClient;
import com.microsoft.azure.spring.integration.eventhub.converter.EventHubMessageConverter;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;

   newMessageHeaders.put("junk","mock");
    MessageHeaders messageHeaders = new MessageHeaders(newMessageHeaders);
    Message<String> message = new Message<String>() {
      @Override
      public String getPayload() {
        return "MockPayload";
      }

      @Override
      public MessageHeaders getHeaders() {
        return messageHeaders;
      }
    };
    System.setProperty("AZURE_CLIENT_SECRET","secret");
    System.setProperty("AZURE_CLIENT_ID","client");
    System.setProperty("AZURE_TENANT_ID","tenant");
    TokenCredential credential = new DefaultAzureCredentialBuilder().build();
    EventHubProducerClient eventHubProducerClient = new EventHubClientBuilder()
            .credential("namespaceName.servicebus.windows.net","mockTopic",credential)
            .buildProducerClient();
    EventHubMessageConverter messageConverter= new EventHubMessageConverter();
    eventHubProducerClient.getEventHubName();
    eventHubProducerClient.getEventHubProperties();
    EventData eventData = messageConverter.fromMessage(message,EntryData.class);
    EventDataBatch batch = eventHubProducerClient.createBatch();
    batch.tryAdd(eventData);
    eventHubProducerClient.send(batch);
    eventHubProducerClient.close();

在 azure hub 事件中心收到的消息在 header 下收到的值为“�$mock”

解决方法

看一下:EventHubMessageConverter.fromString,它使用 Char.defaultCharset(),其中,如果您调用 EventData.getBodyAsString(),我们将返回它以 UTF-8 解码。

这可能是编码器不匹配。您指定一个字符串作为负载,这里的逻辑 AbstractAzureMessageConverter: L113-L115 调用 fromString 将其编码为 Char.defaultCharset()

几个解决方案:

  1. 将有效负载作为一组字节传递,您可以在其中指定字节的编码/解码。
  2. 如果您决定将其作为字符串传入,请使用 Char.defaultCharset() 反序列化您的所有输入参数。使用它的缺点是 defaultCharset 会根据您系统的区域设置而变化。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...