实现注解式注入kafkaTemplate 生产者和消费者,简化配置文件

目录

消费者工厂
/**
* 消费者工厂
*/
@EnableKafka
@Configuration
public class KafkaConsumerFactory { @Autowired
private ApplicationContext context; /**
* 获取消费者工厂
*/
public ConsumerFactory<String, String> consumerFactory(String kafkaBroker) { // 消费者配置信息
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBroker);
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, Boolean.TRUE);
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 10);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); return new DefaultKafkaConsumerFactory<>(props);
} /**
* 容器配置
*
* @param groupId 组名
* @param clazz 消费者监听器
* @param topicName topicName
* @return 容器配置
*/
public ContainerProperties containerProperties(String groupId, Class clazz, String topicName) { ContainerProperties containerProperties = new ContainerProperties(topicName);
containerProperties.setAckMode(AbstractMessageListenerContainer.AckMode.RECORD);
containerProperties.setGroupId(groupId);
containerProperties.setMessageListener(context.getBean(clazz));
return containerProperties;
} /**
* 获取消费容器实例
*
* @param kafkaBroker kafka server
* @param groupId 组名
* @param clazz 消费者监听器
* @param topicName topicName
* @param threadCount 消费线程数
* @return 消息监听容器
*/
public ThreadMessageListenerContainer<String, String> kafkaListenerContainer(
String kafkaBroker, String groupId, Class clazz, String topicName, int threadCount) { ThreadMessageListenerContainer<String, String> container
= new ThreadMessageListenerContainer<>(
consumerFactory(kafkaBroker), containerProperties(groupId, clazz, topicName));
container.setConcurrency(threadCount);
container.getContainerProperties().setPollTimeout(3000);
return container;
} }

生产者工厂
/**
* 生产者工厂
*/
@EnableKafka
@Configuration
public class KafkaProducerFactory { @Autowired
private ApplicationContext context; /**
* 获取生产者工厂
*/
public ProducerFactory<String, String> producerFactory(String kafkaBroker) { Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBroker);
props.put(ProducerConfig.RETRIES_CONFIG, 1);
props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); return new DefaultKafkaProducerFactory<>(props);
} /**
* 注册生产者实例
*/
public KafkaTemplate<String, String> kafkaTemplate(String kafkaBroker, String topicName, Class clazz) { KafkaTemplate<String, String> template = new KafkaTemplate<>(producerFactory(kafkaBroker), Boolean.FALSE);
template.setDefaultTopic(topicName);
template.setProducerListener((ProducerListener<String, String>) context.getBean(clazz));
return template;
}
}

初始化监听器、实例

/**
* kafka 初始化
*/
@Component
public class KafkaInit { /**
* kafka server
*/
@Value("${kafka.servers}")
private String kafkaBroker; /**
* 组名
*/
@Value("${kafka.group}")
private String groupId; /**
* topicName
*/
@Value("${kafka.topic}")
private String topicName; /**
* 消费者工厂
*/
@Autowired
private KafkaConsumerFactory kafkaConsumerFactory; /**
* 生产者工厂
*/
@Autowired
private KafkaProducerFactory kafkaProducerFactory; /**
* 在服务器加载Servlet的时候运行,并且只会被服务器调用一次
*/
@PostConstruct
public void consumer() { kafkaConsumerFactory.kafkaListenerContainer(kafkaBroker, groupId, TestConsumerListener.class, topicName, 6)
.startContainer();
// 加载消费者listener } /**
* 获取生产者实例
*/
@Bean("testSender")
public KafkaTemplate<String, String> testSender() { return kafkaProducerFactory.kafkaTemplate(kafkaBroker, topicName, DefaultProducerListener.class);
} }

用于手动控制容器加载

/**
* 继承消息监听容器
*/
public class ThreadMessageListenerContainer<K, V> extends ConcurrentMessageListenerContainer<K, V> { public ThreadMessageListenerContainer(ConsumerFactory<K, V> consumerFactory, ContainerProperties containerProperties) {
super(consumerFactory, containerProperties);
} public void startContainer() {
super.doStart();
}
}
生产者监听器
/**
* 默认生产者监听器
*/
@Component
public class DefaultProducerListener extends ProducerListenerAdapter { /**
* 发送消息成功后调用
*/
@Override
public void onSuccess(String topic, Integer partition, Object key,
Object value, RecordMetadata recordMetadata) {
super.onSuccess(topic, partition, key, value, recordMetadata);
System.out.println("消息发送成功!");
} /**
* 发送消息错误后调用
*/
@Override
public void onError(String topic, Integer partition, Object key,
Object value, Exception exception) {
super.onError(topic, partition, key, value, exception);
System.out.println("消息发送失败!");
} /**
* 是否开启发送监听
*
* @return true开启,false关闭
*/
@Override
public boolean isInterestedInSuccess() {
return true;
} }
消费者监听器
/**
* 消费者监听器
*/
@Component
public class TestConsumerListener implements MessageListener<String, String> { /**
* 消费消息
*
* @param record 消息
*/
@Override
public void onMessage(ConsumerRecord<String, String> record) { System.out.println(record);
}
}
消息发送测试
/**
* 消息发送
*/
@Component
public class TestProducerSender { /**
* 转账队列发送
*/
@Autowired
@Qualifier("testSender")
private KafkaTemplate kafkaTemplate; /**
* 消息发送测试
*/
public void sendMessage() { kafkaTemplate.sendDefault("message test");
}
}

Spring KafkaTemplate 注解式实现 工厂模式的更多相关文章

  1. spring中注解式事务不生效的问题

    常用的解决方法可以百度,我针对我的问题描述一下 Mysql中InnoDB引擎才支持事务, MyISAM不支持事务. 当你尝试了各种方法解决spring中注解式事务不生效时, 一定要查看一下数据库中表的 ...

  2. spring(7)--注解式控制器的数据验证、类型转换及格式化

    7.1.简介 在编写可视化界面项目时,我们通常需要对数据进行类型转换.验证及格式化. 一.在Spring3之前,我们使用如下架构进行类型转换.验证及格式化: 流程: ①:类型转换:首先调用Proper ...

  3. spring(6)--注解式控制器

    6.1.注解式控制器简介 一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated.   二.Spring2.5引入注解式处理器支持 ...

  4. Spring常用注解式开发

    1.组件注册@Configuration.@Bean给容器中注册组件. 注解,@Configuration告诉Spring这是一个配置类,相当于bean.xml配置文件. 注解,@Bean给Sprin ...

  5. spring + mybatis 注解式事务不回滚的原因分析 @Transactional

    在一个项目中发现spring的事务无法回滚. DEBUG: org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.ses ...

  6. Spring MVC 注解式

    1.注解式控制器简介 一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated.   二.Spring2.5引入注解式处理器支持,通 ...

  7. Spring 16: SM(Spring + MyBatis) 注解式事务 与 声明式事务

    Spring事务处理方式 方式1:注解式事务 使用@Transactional注解完成事务控制,此注解可添加到类上,则对类中所有方法执行事务的设定,注解添加到方法上,则对该方法执行事务处理 @Tran ...

  8. Spring MVC注解式开发

    MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处理器, 无需在xml中注册. 只需在代码中通过对类与方法的注解, 即可完成注册. 定义处理器 @Controller: 当前类为处理器 @ ...

  9. Spring中常见的设计模式——工厂模式

    一.简单工厂模式 简单工厂模式(Simple Factory Pattern)由一个工厂对象决定创建哪一种产品类的实例,简单工厂模式适用于工厂类负责创建对象较少的情况,且客户端只需要传入工厂类的参数, ...

随机推荐

  1. 22.从上往下打印二叉树(python)

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. class Solution: # 返回从上到下每个节点值列表,例:[1,2,3] def PrintFromTopToBottom( ...

  2. Linux培训教程 浅谈:PHP在linux上执行外部命令(整理)

    一.PHP中调用外部命令介绍 二.关于安全问题 三.关于超时问题 四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,可以用,1>调用专门函数 ...

  3. LCA模板 ( 最近公共祖先 )

    LCA 有几种经典的求取方法.这里只给出模板,至于原理我完全不懂. 1.RMQ转LCA.复杂度O(n+nlog2n+m) 大致就是 DFS求出欧拉序 => 对欧拉序做ST表 => LCA( ...

  4. socket编程相关阐述

    一.socket初识 ①服务端 import socket server = socket.socket() server.bind(('127.0.0.1', 8080)) server.liste ...

  5. rollup的学习

    概述(Overview) Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序.Rollup 对代码模块使用新的标准化格式,这些 ...

  6. win10笔记本设置管理员权限

    1.在右下方任务栏的“搜索web和windows”输入框中输入“gpedit.msc”,电脑会自行搜索,搜索完毕之后鼠标点击打开.

  7. 使用mysql以及连接数据库

    MySQL Table of Contents 1. 安装与配置 2. 数据库与账户 3. 用户跟权限 4. 常用命令 5. 表的创建 6. 数据类型 7. 主键约束 8. 表的修改 9. 引擎(En ...

  8. 微信小程序打印json log

    微信小程序中如果 res.data数据是一个json格式数据.console.log("===data===" + res.data);//如果这样打印出了是只会打印一个对象名称, ...

  9. hibernate一对一单项关联映射

    一.主键关联 1.两个实体对象的主键一样,以表明它们之间的一一对应关系: 2.不需要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值. Pe ...

  10. mysql-8.0解压缩版安装配置完整过程

    https://www.cnblogs.com/xiongzaiqiren/p/8970203.html