使用者未收到Spring Cloud Stream活页夹Kafka自定义标头

时间:2019-05-24 13:06:00

标签: spring-kafka spring-cloud-stream

我正在使用Edgware.SR4版本的Spring云流活页夹kafka。

我已经将自定义标头设置为消息有效负载并发布了,但是我在消费者端看不到那些标头。

我已经使用Message对象来绑定有效负载和标头。我已经尝试添加属性spring.cloud.stream.kafka.binder.headers,但是它不起作用

制作人:

Application.yml

spring:
  cloud:
    stream:
      bindings:
        sampleEvent:
          destination: sample-event
          content-type: application/json
      kafka:
        binder:
          brokers: localhost:9092
          zkNodes: localhost:2181
          autoCreateTopics: false
          zkConnectionTimeout: 36000

MessageChannelConstants.java

public class MessageChannelConstants {
    public static final String SAMPLE_EVENT = "sampleEvent";
        private MessageChannelConstants() {}
}

SampleMessageChannels.java

public interface SampleMessageChannels {

    @Output(MessageChannelConstants.SAMPLE_EVENT)
    MessageChannel sampleEvent();
}

SampleEventPublisher.java

@Service
@EnableBinding(SampleMessageChannels.class)
public class SampleEventPublisher{

@Autowired
private SampleMessageChannels sampleMessageChannels;

public void publishSampleEvent(SampleEvent sampleEvent) {
        final Message<SampleEvent> message = MessageBuilder.withPayload(sampleEvent).setHeader("appId", "Demo").build();
    MessageChannel messageChannel = SampleMessageChannels.sampleEvent();
    if (messageChannel != null) {
        messageChannel.send(message);
    }
}
}

消费者:

application.yml

spring:
  cloud:
    stream:
      bindings:
        sampleEvent:
          destination: sample-event
          content-type: application/json
      kafka:
        binder:
          brokers: localhost:9092
          zkNodes: localhost:2181
          autoCreateTopics: false
          zkConnectionTimeout: 36000

MessageChannelConstants.java

public class MessageChannelConstants {

    public static final String SAMPLE_EVENT = "sampleEvent";

    private MessageChannelConstants() {}
}

SampleMessageChannels.java

public interface SampleMessageChannels {

    @Output(MessageChannelConstants.SAMPLE_EVENT)
    MessageChannel sampleEvent();
}

SampleEventListener.java

@Service
@EnableBinding(SampleMessageChannels.class)
public class SampleEventListener{

@StreamListener(MessageChannelConstants.SAMPLE_EVENT)
public void listenSampleEvent(@Payload SampleEvent event,
    @Header(required = true, name = "appId") String appId) {

     // do something 
}

下面是我遇到的异常

org.springframework.messaging.MessageHandlingException: Missing header 'appId' for method parameter type [class java.lang.String]
    at org.springframework.messaging.handler.annotation.support.HeaderMethodArgumentResolver.handleMissingValue(HeaderMethodArgumentResolver.java:100)
    at org.springframework.messaging.handler.annotation.support.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:103)
    at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:112)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:135)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:107)
    at org.springframework.cloud.stream.binding.StreamListenerMessageHandler.handleRequestMessage(StreamListenerMessageHandler.java:55)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:425)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:375)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:360)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:271)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:188)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:115)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
    at org.springframework.integration.channel.FixedSubscriberChannel.send(FixedSubscriberChannel.java:70)
    at org.springframework.integration.channel.FixedSubscriberChannel.send(FixedSubscriberChannel.java:64)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105)
    at org.springframework.integration.endpoint.MessageProducerSupport.sendMessage(MessageProducerSupport.java:188)
    at org.springframework.integration.kafka.inbound.KafkaMessageDrivenChannelAdapter.access$200(KafkaMessageDrivenChannelAdapter.java:63)
    at org.springframework.integration.kafka.inbound.KafkaMessageDrivenChannelAdapter$IntegrationRecordMessageListener.onMessage(KafkaMessageDrivenChannelAdapter.java:372)
    at org.springframework.integration.kafka.inbound.KafkaMessageDrivenChannelAdapter$IntegrationRecordMessageListener.onMessage(KafkaMessageDrivenChannelAdapter.java:352)
    at org.springframework.kafka.listener.adapter.RetryingAcknowledgingMessageListenerAdapter$1.doWithRetry(RetryingAcknowledgingMessageListenerAdapter.java:79)
    at org.springframework.kafka.listener.adapter.RetryingAcknowledgingMessageListenerAdapter$1.doWithRetry(RetryingAcknowledgingMessageListenerAdapter.java:73)
    at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:287)
    at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:180)
    at org.springframework.kafka.listener.adapter.RetryingAcknowledgingMessageListenerAdapter.onMessage(RetryingAcknowledgingMessageListenerAdapter.java:73)
    at org.springframework.kafka.listener.adapter.RetryingAcknowledgingMessageListenerAdapter.onMessage(RetryingAcknowledgingMessageListenerAdapter.java:39)
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:792)
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:736)
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.access$2100(KafkaMessageListenerContainer.java:246)
    at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer$ListenerInvoker.run(KafkaMessageListenerContainer.java:1025)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:748)

注意:我也使用Spring Cloud Sleuth和zipkin依赖项。

1 个答案:

答案 0 :(得分:0)

使用Edgware(SCSt Ditmars),您必须指定要传输的标头。

See Kafka Binder Properties

这是因为Edgware在其本身支持头文件之前就基于Kafka,因此我们将头文件编码为有效负载。

  

spring.cloud.stream.kafka.binder.headers

     

活页夹将传输的自定义标头的列表。

     

默认:空。

还应该确保将spring-kafka升级到1.3.9.RELEASE,并将kafka-clients升级到0.11.0.2。

不过,最好升级到Finchley或Greemwich。这些版本本机支持标头。

相关问题