我正在为在我的项目中实施kafka集群的POC工作。我在本地计算机上通过3个代理设置了一个kafka集群。现在,我正在使用Spring MVC REST服务将消息发送到Kafka服务器,该服务在内部使用Spring Kafka来产生和使用往返于Kafka集群的消息。现在,当代理关闭时,当消费者无法从主题接收消息时,我尝试发送警报。我关闭了与消费者连接的唯一代理。我的日志中没有任何异常,但收到以下警告消息。
0:20:35.500 [TEST_GROUP-0-C-1]警告 o.apache.kafka.clients.NetworkClient-[Consumer clientId = consumer-1, groupId = TEST_GROUP]无法连接到节点2147483645 成立。经纪人可能不可用。
是否可以捕获此警告消息,以便在消费者失去连接时发送警报?下面是我的消费者代码。
private static final Logger LOGGER = LoggerFactory.getLogger(ListenerServiceImpl.class);
@Autowired
Dao<RnMessage> messageDao;
@Autowired
MessageService messageService;
@KafkaListener(id = "TEST_GROUP", topics = "TESTQUEUE", errorHandler="eventQueueMessageListenerExceptionHandler")
public void listenMessageInQueue(String msg) {
try {
//String str = new String(msg, "UTF-8");
LOGGER.info("receiving payload='{}'", msg);
messageDao.saveMessage(msg);
messageService.sendMessageToOutQueue(msg);
}catch(Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:2)
当使用者无法轮询代理时,它将抛出NonResponsiveConsumerEvent。可以使用@EventListener捕获此事件。
这是示例代码:
@EventListener()
public void eventHandler(NonResponsiveConsumerEvent event) {
//When Kafka server is down, NonResponsiveConsumerEvent error is caught here.
System.out.println("CAUGHT the event "+ event);
}
您可以在文档中查看更多详细信息。 https://docs.spring.io/spring-kafka/reference/htmlsingle/#idle-containers
我在文档中专门提到了这一点。
如果经纪人无法联系(在撰写本文时),则消费者 poll()方法不会退出,因此不会接收任何消息并且处于空闲状态 事件无法生成。为了解决这个问题,容器将 发布NonResponsiveConsumerEvent
有效的JUnit测试代码在这里-https://github.com/shankarps/KafkaDemo/blob/master/src/test/java/com/kafkademo/stack/TestConsumerWithNonAvailableBroker.java