如何在spring cloud stream和kafka中发送和接收相同的主题

时间:2016-07-21 02:59:33

标签: spring spring-boot spring-integration spring-cloud-stream spring-cloud-dataflow

我有一个带有kafka绑定的spring-cloud-stream应用程序。我想从同一个可执行文件(jar)中发送和接收来自同一主题的消息。我有我的频道定义,如下所示: - public interface ChannelDefinition { @Input("forum") public SubscriableChannel readMessage(); @Output("forum") public MessageChannel postMessage(); }

我使用@StreamListener来接收邮件。我得到各种意想不到的错误。有时候,我会收到

  1. 没有为每个其他消息找到unknown.message.channel的调度程序
  2. 如果我将命令行kafka订阅者附加到上述论坛主题,它会收到所有其他消息。
  3. 我的应用程序接收所有其他消息,这是来自命令行订阅者的独占消息集。我确保我的应用程序在特定的组名下订阅。
  4. 是否有上述用例的工作示例?

2 个答案:

答案 0 :(得分:9)

这是定义可绑定通道的错误方法(因为两者都使用forum名称)。我们应该更彻底并且快速失败,但是您将输入和输出绑定到同一个通道并在应用程序中创建竞争消费者。这也解释了备用消息的另一个问题。

你应该做的是:

public interface ChannelDefinition { 

   @Input
   public MessageChannel readMessage();

   @Output
   public MessageChannel postMessage();
}

然后使用应用程序属性将您的频道绑定到同一队列:

spring.cloud.stream.bindings.readMessage.destination=forum
spring.cloud.stream.bindings.postMessage.destination=forum

答案 1 :(得分:0)

除了上面的Marius Bogoevici的答案以外,这是一个如何收听该输入的示例。

@StreamListener
public void handleNewOrder(@Input("input") SubscribableChannel input) {
    logger.info("Subscribing...");
    input.subscribe((message) -> {
        logger.info("Received new message: {}", message);
    });
}