生产环境刻意跑while死循环有什么问题吗?

用springboot框架,主要功能是用canal二进制消息订阅消费
需要一直

Message message = connector.getWithoutAck(batchSize);

来获取消息,定一个一个类 implements ApplicationRunner,重写run()方法

@Override
public void run(ApplicationArguments args)  {
    CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress(localhost, 11111), "example", "", "");
    while(true) {
        Long batchId = null;
        try {
            connector.connect();
            while (true) {
                Message message = connector.getWithoutAck(batchSize);
                batchId = message.getId();
                consume(message);
                。。。
                connector.ack(batchId);
            }
        }catch (CanalClientException e) {
            sleep(60*1000);
        } catch (Exception e) {
            if (batchId != null) {
                connector.rollback(batchId);
            }
        } finally {
            try {
                connector.disconnect();
            } catch (Exception e) {
            }
        } 
          
    }
    

有问题吗?会导致cpu太高吗?

阅读 3.5k
2 个回答

有没有问题取决于死循环里是阻塞还是非阻塞的,如果是阻塞的就没啥大问题,但还是建议每次循环 sleep 一下,不用多,一毫秒都行,把时间片让出来,防止 CPU 空跑。

sleep不要放到CanalClientException异常处理里,可以放到while循环的最后变。另外建议while里每次都sleep一下,并且增加跳出机制或者跳出开关也行,防止异常时线上一直报警。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题