80
80
* @author Gary Russell
81
81
* @author Artem Bilan
82
82
* @author Venil Noronha
83
+ * @author Nathan Xu
83
84
*/
84
85
public abstract class MessagingMessageListenerAdapter <K , V > implements ConsumerSeekAware {
85
86
@@ -470,8 +471,8 @@ protected void sendResponse(Object result, String topic, @Nullable Object source
470
471
if (!returnTypeMessage && topic == null ) {
471
472
this .logger .debug (() -> "No replyTopic to handle the reply: " + result );
472
473
}
473
- else if (result instanceof Message ) {
474
- Message <?> reply = checkHeaders (result , topic , source );
474
+ else if (result instanceof Message <?> mResult ) {
475
+ Message <?> reply = checkHeaders (mResult , topic , source );
475
476
this .replyTemplate .send (reply );
476
477
}
477
478
else {
@@ -483,8 +484,9 @@ else if (result instanceof Message) {
483
484
}
484
485
if (iterableOfMessages || this .splitIterables ) {
485
486
((Iterable <V >) result ).forEach (v -> {
486
- if (v instanceof Message ) {
487
- this .replyTemplate .send ((Message <?>) v );
487
+ if (v instanceof Message <?> mv ) {
488
+ Message <?> aReply = checkHeaders (mv , topic , source );
489
+ this .replyTemplate .send (aReply );
488
490
}
489
491
else {
490
492
this .replyTemplate .send (topic , v );
@@ -501,24 +503,23 @@ else if (result instanceof Message) {
501
503
}
502
504
}
503
505
504
- private Message <?> checkHeaders (Object result , String topic , @ Nullable Object source ) { // NOSONAR (complexity)
505
- Message <?> reply = (Message <?>) result ;
506
+ private Message <?> checkHeaders (Message <?> reply , @ Nullable String topic , @ Nullable Object source ) { // NOSONAR (complexity)
506
507
MessageHeaders headers = reply .getHeaders ();
507
- boolean needsTopic = headers .get (KafkaHeaders .TOPIC ) == null ;
508
+ boolean needsTopic = topic != null && headers .get (KafkaHeaders .TOPIC ) == null ;
508
509
boolean sourceIsMessage = source instanceof Message ;
509
- boolean needsCorrelation = headers .get (this .correlationHeaderName ) == null && sourceIsMessage ;
510
+ boolean needsCorrelation = headers .get (this .correlationHeaderName ) == null && sourceIsMessage
511
+ && getCorrelation ((Message <?>) source ) != null ;
510
512
boolean needsPartition = headers .get (KafkaHeaders .PARTITION ) == null && sourceIsMessage
511
513
&& getReplyPartition ((Message <?>) source ) != null ;
512
514
if (needsTopic || needsCorrelation || needsPartition ) {
513
515
MessageBuilder <?> builder = MessageBuilder .fromMessage (reply );
514
516
if (needsTopic ) {
515
517
builder .setHeader (KafkaHeaders .TOPIC , topic );
516
518
}
517
- if (needsCorrelation && sourceIsMessage ) {
518
- builder .setHeader (this .correlationHeaderName ,
519
- ((Message <?>) source ).getHeaders ().get (this .correlationHeaderName ));
519
+ if (needsCorrelation ) {
520
+ setCorrelation (builder , (Message <?>) source );
520
521
}
521
- if (sourceIsMessage && reply . getHeaders (). get ( KafkaHeaders . REPLY_PARTITION ) == null ) {
522
+ if (needsPartition ) {
522
523
setPartition (builder , (Message <?>) source );
523
524
}
524
525
reply = builder .build ();
@@ -531,8 +532,8 @@ private void sendSingleResult(Object result, String topic, @Nullable Object sour
531
532
byte [] correlationId = null ;
532
533
boolean sourceIsMessage = source instanceof Message ;
533
534
if (sourceIsMessage
534
- && ((Message <?>) source ). getHeaders (). get ( this . correlationHeaderName ) != null ) {
535
- correlationId = ((Message <?>) source ). getHeaders (). get ( this . correlationHeaderName , byte []. class );
535
+ && getCorrelation ((Message <?>) source ) != null ) {
536
+ correlationId = getCorrelation ((Message <?>) source );
536
537
}
537
538
if (sourceIsMessage ) {
538
539
sendReplyForMessageSource (result , topic , source , correlationId );
@@ -571,6 +572,18 @@ private void sendReplyForMessageSource(Object result, String topic, Object sourc
571
572
this .replyTemplate .send (builder .build ());
572
573
}
573
574
575
+ private void setCorrelation (MessageBuilder <?> builder , Message <?> source ) {
576
+ byte [] correlationBytes = getCorrelation (source );
577
+ if (correlationBytes != null ) {
578
+ builder .setHeader (this .correlationHeaderName , correlationBytes );
579
+ }
580
+ }
581
+
582
+ @ Nullable
583
+ private byte [] getCorrelation (Message <?> source ) {
584
+ return source .getHeaders ().get (this .correlationHeaderName , byte [].class );
585
+ }
586
+
574
587
private void setPartition (MessageBuilder <?> builder , Message <?> source ) {
575
588
byte [] partitionBytes = getReplyPartition (source );
576
589
if (partitionBytes != null ) {
0 commit comments