我想用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。
答案 0 :(得分:1)
如果您想避免嵌入标题(以便您可以在某些非Spring Cloud Stream应用中接收消息),请将制作人headerMode
设置为raw
。
<强> headerMode 强>
设置为raw时,禁用输出上的标头嵌入。仅对本身不支持邮件头并需要标头嵌入的邮件中间件有效。在为非Spring Cloud Stream应用程序生成数据时很有用。
默认值:embeddedHeaders。
答案 1 :(得分:0)
消费者应用程序反序列化消息时,Spring Cloud Stream会使用contentType
和originalContentType
标头,并根据内容类型集执行消息转换。
只有在您按照此处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)运行的各种应用程序