0

Spring Cloud Stream Kafkaを使用してトピックから読み込むSpringブートアプリケーション(app0)があります。Spring Cloud Stream Kafka - EmbeddedHeadersMessageConverter - StringIndexOutOfBoundsException:文字列インデックスが範囲外です

そのトピックにメッセージを生成する2つのアプリ(app1app2)があります。例えば

public interface OrderSource{ 

    String OUTPUT_PAYMENT = Topic.PAYMENT_RESULTS; 

    @Output(OrderSource.OUTPUT_PAYMENT) 
    MessageChannel output(); 

APP1インターフェイスOrderSourceを使用してメッセージパブリッシュこの場合

orderSource.output().send(MessageBuilder.withPayload(order).build(), 500); 

を、APP0問題なくAPP1からメッセージを読み取ります。私はEmbeddedHeadersMessageConverterから次の例外を観察しています。この場合、

ListenableFuture<SendResult<Integer, String>> delivery = kafkaTemplate.send(Topic.PAYMENT_RESULTS, "{ ... }"); 
try { 
    SendResult<Integer, String> result = delivery.get(timeout, TimeUnit.MILLISECONDS); 

java.lang.StringIndexOutOfBoundsException: String index out of range: 152 
    at java.lang.String.checkBounds(Unknown Source) ~[na:1.8.0_91] 
    at java.lang.String.<init>(Unknown Source) ~[na:1.8.0_91] 
    at org.springframework.cloud.stream.binder.EmbeddedHeadersMessageConverter.oldExtractHeaders(EmbeddedHeadersMessageConverter.java:135) ~[spring-cloud-stream-1.1.0.RELEASE.jar:1.1.0.RELEASE] 
    at org.springframework.cloud.stream.binder.EmbeddedHeadersMessageConverter.extractHeaders(EmbeddedHeadersMessageConverter.java:105) ~[spring-cloud-stream-1.1.0.RELEASE.jar:1.1.0.RELEASE] 

をどうやらのペイロードからヘッダを抽出しようとしている

APP2はKafkaTemplateを使用して、そのメッセージをパブリッシュメッセージ。両方のメッセージソース(KafkaTemplateとOrderSource)をサポートしているときに、この例外が発生しないようにするにはどうすればよいですか。

答えて

1

非Spring-Cloud-Streamアプリケーションと通信するには、コンシューマのheaderModerawに設定する必要があります。

app1についても同じことを行う必要があります。ヘッダーは埋め込まれません。

consumer propertiesおよびproducer propertiesを参照してください。

+0

ありがとうございました。いくつかの質問:ヘッダーを埋め込まないことの連続は何ですか?彼らはまだ送られますか? – codependent

+0

カフカにはヘッダの概念がありません。そのため、ペイロードに埋め込まなければなりません。転送されるヘッダーは(デフォルトで)コンテンツタイプのみです。コンシューマアプリケーションで複雑なメッセージ変換を実行するためにバインダを使用している場合にのみ必要です。必要な場合、または任意のカスタムヘッダーを埋め込むために送信(app1)バインダーを設定した場合、あなたは不運です。しかし、回避するには、送信する前にapp2で埋め込みコンバータを使用することがあります。または、app1/app2に異なるトピックを使用し、それに応じてapp0を構成します。 –

+0

今はすべてがクリアです、ありがとう!!これを行うための参照を指摘できますか? 'あなたのapp2で埋め込みコンバーターを使用して送信すると、回避することができます – codependent

関連する問題