实现注解式注入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. pluginManagement的坑

    想用protobuf-maven-plugin插件,用了<pluginManagement/>标签包裹<plugin/>,就引不进来,去掉就可以引进来.需要研究下. <b ...

  2. html br标签 语法

    html br标签 语法 br标签什么意思? 作用:插入一个简单的换行符.广州大理石机械构件 说明:<br> 标签是空标签(意味着它没有结束标签,因此这是错误的:<br>< ...

  3. html address标签 语法

    html address标签 语法 作用:定义文档作者/所有者的联系信息. 说明:如果 <address> 元素位于 <body> 元素内部,则它表示该文档作者/所有者的联系信 ...

  4. css了解一下!!!

    css简介 css(cascading style sheet,层叠样式表):为了让网页的内容核样式拆分开; 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染); css语法 cs ...

  5. 用JavaServiceWrapper将JAVA程序发布成Windows服务

    怎么把jar文件做成系统服务,比较多的解决方案是使用 wrapper-windows 这个软件包.这个软件包的强大之处是能把jre环境也给打进去,这个服务可以正常运行在根本没有jre环境即就没有安装J ...

  6. vue 在移动端实现红包雨 (兼容性好)

    下面是代码:<template>    <div class="ser_home">        <ul class="red_packe ...

  7. 读读《编写高质量代码:改善Java程序的151条建议》

    这本书可以作为平时写代码的一个参考书,这本书以我个人读的经验看来,最好是通过平时代码驱动的方式来读,这样吸收的快,也读的快. 这本书主要讲什么,我自己用了个思维导图概述: 根据这种导图可知,主要讲的就 ...

  8. 关于kafka在windows上的安装、运行

    一.安装kafka    下载地址:http://kafka.apache.org/downloads 要下载Binary downloads这个类型,不要下载源文件,这种方便使用.下载后,解压放在D ...

  9. 第四周实验总结&实验报告

    实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: 理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性 ...

  10. Ubuntu18.04修改为阿里云

    对源安装时,要先知道系统的版本,以免安装错的版本 使用命令:lsb_release -c 备份原先的配置文件 cd /etc/apt sudo cp sources.list sources.list ...