mq消费者小技巧
1.指定Stop接口
public interface IStop {
void close();
}
2.指定Consumer接口
public interface IConsumer extends IStop{
void init();
void start() throws Exception;
}
3.定义mq消费者kafka的消费类
@Component
public class ConsumerService extends Thread implements IConsumer {
public void init() {
// 进行初始化动作
logger.info("app {}, token {}, nameserver {}, topic {}", app, token, nameserver, topic);
this.processorList.add(new RedisProcessor());
Properties props = new Properties();
String jaasConfigFormat = "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"%s\" password=\"%s\";";
String jaasConfig = String.format(jaasConfigFormat, app, token);
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, nameserver);
props.put(ConsumerConfig.GROUP_ID_CONFIG, app);
props.put(ConsumerConfig.CLIENT_ID_CONFIG, app);
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, SecurityProtocol.SASL_PLAINTEXT.name());
props.put(CommonClientConfigs.RETRIES_CONFIG, SecurityProtocol.SASL_PLAINTEXT.name());
props.put(SaslConfigs.SASL_MECHANISM, "PLAIN");
props.put(SaslConfigs.SASL_JAAS_CONFIG, jaasConfig);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 100000);
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 20);
props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 2000000);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
props.put(ConsumerConfig.CONNECTIONS_MAX_IDLE_MS_CONFIG, 30000);
this.kafkaConsumer = new KafkaConsumer<>(props);
kafkaConsumer.subscribe(Sets.newHashSet(topic));
}
@Override
public synchronized void start() {
super.setName("DeltaKafkaThreadService");
super.start();
}
@Override
public void run() {
while (Stopper.isRunning()) {
try {
ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofMillis(3000));
records.forEach(record -> {
Record record1 = converter.convert(record);
processorList.forEach(process -> process.process(record1));
});
commit();
} catch (Exception ex) {
logger.error("handle msg exception ", ex);
}
}
}
// 手动commit offset
private void commit() {
kafkaConsumer.commitAsync((offsets, exception) -> {
if (exception != null) {
logger.warn("offset info:={} exception: ", offsets, exception);
}
});
}
@Override
public void close() {
commit();
kafkaConsumer.close();
}
}
原创:做时间的朋友
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2021-11-11 Centos6的yum源
2021-11-11 SpringBoot支持跨域请求