如何在Spring Kafka Listener上捕获警告“经纪人可能不可用”

时间:2018-12-27 15:48:33

标签: java spring apache-kafka spring-kafka

我正在为在我的项目中实施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();
        }       
    }

1 个答案:

答案 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