我正在尝试在Spring集成中实现自定义入站通道适配器以使用来自apache kafka的消息。基于spring集成示例,我发现我需要创建一个实现MessageSource接口的类,并实现将从kafka返回消耗的Message的receive()方法。但基于consumer example in kafka,KafkaStream中的消息迭代器由BlockingQueue支持。因此,如果队列中没有消息,则该线程将被阻止。
那么实现receive()方法的最佳方法是什么,因为这个方法可能会阻塞,直到有东西要消耗..?
从更一般的意义上讲,我们如何为流式消息源实现自定义入站通道,直到有可以使用的内容为止?
答案 0 :(得分:4)
receive()方法可以阻塞(只要底层操作对中断的线程做出正确响应),并且从入站通道适配器的角度来看,根据底层源的期望,可能最好使用固定延迟触发器。例如,当提供非常小的延迟值时,“长轮询”可以模拟事件驱动的行为。
我们在JMS轮询MessageSource实现中有类似的情况。在那里,底层行为由JmsTemplate的receive()方法之一处理。 JmsTemplate本身允许配置超时值。这意味着,作为示例,您可以选择阻止最多5秒,但在每个阻塞接收呼叫之间具有非常短的延迟触发。或者,您可以指定无限期接收超时。决定最终取决于底层资源的期望,消息吞吐量等。
另外,我想告诉您我们正在探索Kafka适配器。也许您想在spring-integration-extensions存储库中就此进行协作?
此致 标记