Search code examples
javaspring-bootazureazure-eventhub

Junk value added to the header when message sent to Azure event hub topic


I am sending a message to the Azure event hub but the received contains "�$" at the starting of the header value. Code:

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();

The message received at the azure hub event hub under header the received value is "�$mock"


Solution

  • Looking at: EventHubMessageConverter.fromString, it uses Char.defaultCharset() where-as, if you call EventData.getBodyAsString(), we return it UTF-8 decoded.

    This could be an encoder mismatch. You are specifying a string as the payload, and this logic here AbstractAzureMessageConverter: L113-L115 calls that fromString to encode as Char.defaultCharset().

    A couple of solutions:

    1. Pass the payload as a set of bytes where you specify the encoding/decoding of the bytes.
    2. Deserialize all your input parameters using Char.defaultCharset() if you decide to pass it in as a string. The downside to using this is that the defaultCharset changes depending on the locale of your system.