Spring Cloud Stream Kafka Producer消息

时间:2017-08-22 10:02:12

标签: java spring apache-kafka spring-cloud-stream spring-kafka

我想用spring boot设置一个spring-cloud-stream-kafka制作人。

生产者正在工作,我可以使用来自kafka代理的消息,但消息中还包含一些标题信息,如下所示:

contentType   "text/plain"originalContentType    "application/json;charset=UTF-8"{"message":"hello"}

我的POJO包含一个字段(字符串消息),因此我希望只将JSON字符串发送给kafka。

我的RestController中的方法test()触发了生产者:

@EnableBinding(ProducerChannels.class)
@SpringBootApplication
@RestController
public class KafkaStreamProducerApplication {

private MessageChannel consumer;

public KafkaStreamProducerApplication(ProducerChannels channels) {
    this.consumer = channels.consumer();
}

@PostMapping("/test/{message}")
public void test(@PathVariable String message) {
    Message<MyMessage> msg = MessageBuilder.withPayload(new MyMessage(message)).build();
    this.consumer.send(msg);
}

interface ProducerChannels {

    @Output
    MessageChannel consumer();
}

我的application.properties

spring.cloud.stream.bindings.consumer.destination=consumer
spring.cloud.stream.bindings.consumer.content-type=application/json

如果您能就此主题推荐任何文档或示例,我将不胜感激。 github上的示例通常很薄,它们使用了大量自动配置而没有解释。我使用的例子是RabbitMQ。

2 个答案:

答案 0 :(得分:1)

如果您想避免嵌入标题(以便您可以在某些非Spring Cloud Stream应用中接收消息),请将制作人headerMode设置为raw

请参阅Producer Properties

  

<强> headerMode

     

设置为raw时,禁用输出上的标头嵌入。仅对本身不支持邮件头并需要标头嵌入的邮件中间件有效。在为非Spring Cloud Stream应用程序生成数据时很有用。

     

默认值:embeddedHeaders。

答案 1 :(得分:0)

消费者应用程序反序列化消息时,Spring Cloud Stream会使用contentTypeoriginalContentType标头,并根据内容类型集执行消息转换。

只有在您按照此处contentType配置绑定的内容类型时,才会显式设置spring.cloud.stream.bindings.consumer.content-type=application/json标头。 设置contentType标头后,Spring Cloud Stream会在序列化/反序列化过程中使用originalContentType标志保留此标头,从而生成/消费来自代理的消息(通过活页夹)。

在您的情况下,我猜您可能根本不需要设置contentType

对于除spring-cloud-stream-samples github repo中的示例之外的示例,您还可以参考out of the box app starters,其涵盖可能针对任何支持的绑定器(包括​​Kafka)运行的各种应用程序