在工作中碰到问题,需要通过springboot想kafka发送消息,但是之前没有发送过,因此尝试发送一下试试,给大家做一个参考。
1 、准备kafka消息队列
- address:...:9092
- topic:test
2 、jar包引用
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.1.0</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
- 3 、初始化KafkaProducer
@Component
public class KafkaProducerFactory {
private static final Logger logger = LoggerFactory.getLogger(KafkaProducerFactory.class);
private String address = "ipaddress";
@Bean
public KafkaProducer<Integer, String> producerFactory() {
Properties props = new Properties();
//kafka的ip地址
props.setProperty("bootstrap.servers", address);
//序列化类
props.setProperty("key.serializer", "org.apache.kafka.common.serialization.IntegerSerializer");
props.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<Integer, String> producer = null;
try {
producer = new KafkaProducer<Integer, String>(props);
} catch (Exception ex) {
logger.error("Init Kafka Producer Error!", ex);
}
return producer;
}
}
- 4、KafkaMessageService 发送service
@Component
public class KafkaMessageService {
private static AtomicInteger messageNo = new AtomicInteger(0);
private static final Logger logger = LoggerFactory.getLogger(KafkaMessageService.class);
private static final ExecutorService taskExecutor = new ThreadPoolExecutor(
5,
5,
0,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(1024));
@Autowired
private KafkaProducer<Integer, String> producer;
private String topic="test";
/**
* 发送消息到管理端,发送失败自动重复
*
* @param friend
*/
public void pushToManager(final Friend friend) {
taskExecutor.submit(new Runnable() {
@Override
public void run() {
Map<String,Object> data = Maps.newHashMap();
data.put("userId",friend.getUserid());
data.put("key1",friend.getExpertuserid());
data.put("key2",friend.getCreatetime());
ProducerRecord<Integer, String> record = new ProducerRecord<Integer, String>(
topic,
messageNo.incrementAndGet(),
JSON.toJSONString(data));
try {
producer.send(record).get(); //发送消息
} catch (Exception e) {
logger.warn("Kafka error, message: {}", friend);
}
}
});
}
}
1、为甚要用多线程去发?
kafka升级,需要服务端同步审计相应的包,如果不升级会抛出异常,影响正常业务。