java - 当消息发送到 Azure 事件中心主题时,垃圾值添加到 header

标签 java spring-boot azure azure-eventhub

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

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 根据系统的区域设置而变化。

关于java - 当消息发送到 Azure 事件中心主题时,垃圾值添加到 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68410571/

相关文章:

tomcat - 为什么 Logback-spring 在具有多个服务的 tc-server 上记录到错误的文件位置?

spring-boot - Spring Boot 中通过 RabbitMQ 发送-接收集合

azure - 为什么按时间戳(字符串)排序的 Azure Cosmos 查询比按 _ts(内置)排序的成本高得多?

java - 对生产中的一段 Java 代码进行计时。

java - 配置错误 "use google cloud sql instance"

java - 如何在 hibernate/spring 中使用 LOCK IN SHARE MODE?

java - Spring Boot findById 不起作用,但 findAllById 工作正常

sql-server - 由WITH子句引起的Azure SQL Server查询错误

azure - 应用程序洞察请求被吞没?

java - 为什么来自 'Concurrency in practice' 的 CooperatingNoDeadlock 使用与同一监视器的双同步?