当消息发送到 Azure 事件中心主题时添加到 header 的垃圾值
Junk value added to the header when message sent to Azure event hub topic
我正在向 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();
在 header 下的 azure hub 事件中心收到的消息收到的值为“$mock”
查看:EventHubMessageConverter.fromString, it uses Char.defaultCharset()
where-as, if you call EventData.getBodyAsString(),我们return它是 UTF-8 解码的。
这可能是编码器不匹配。您正在指定一个字符串作为有效负载,这里的逻辑 AbstractAzureMessageConverter: L113-L115 调用 fromString
编码为 Char.defaultCharset()
.
几个解决方案:
- 将负载作为一组字节传递,您可以在其中指定 encoding/decoding 个字节。
- 如果您决定将输入参数作为字符串传入,请使用
Char.defaultCharset()
反序列化所有输入参数。使用它的缺点是 defaultCharset 会根据您系统的区域设置而变化。
我正在向 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();
在 header 下的 azure hub 事件中心收到的消息收到的值为“$mock”
查看:EventHubMessageConverter.fromString, it uses Char.defaultCharset()
where-as, if you call EventData.getBodyAsString(),我们return它是 UTF-8 解码的。
这可能是编码器不匹配。您正在指定一个字符串作为有效负载,这里的逻辑 AbstractAzureMessageConverter: L113-L115 调用 fromString
编码为 Char.defaultCharset()
.
几个解决方案:
- 将负载作为一组字节传递,您可以在其中指定 encoding/decoding 个字节。
- 如果您决定将输入参数作为字符串传入,请使用
Char.defaultCharset()
反序列化所有输入参数。使用它的缺点是 defaultCharset 会根据您系统的区域设置而变化。