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