Spring Framework为消息传递的集成提供了广泛的支持,从一开始的使用JMA API的JmsTemplate到异步接收消息的完整基础结构。
Spring AMQP为高级消息队列协议提供了类似的功能集。
Spring Boot为RabbitTemplate和RabbitMQ提供了自动配置选项
Spring WebSocket本身包含对STOMP消息传递的支持
Spring Boot也支持Apache Kafka。
文章目录
1. JMS
javax.jms.ConnectionFactory
接口提供了创建javax.jms.connection
的标准方法用于与JMS代理进行交互。
1.1. ActiveMQ
Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。
具体操作可参考Spring Boot ActiveMQ
1.2. Artemis(暂未完善)
1.3. JNDI ConnectionFactory(暂未完善)
1.4. 发送消息
使用jmsMessagingTemplate
发送消息
this.jmsMessagingTemplate.convertAndSend(this.queue,"Queue Send");
1.5. 接收消息
使用@JmsListener
注解接收消息
@JmsListener(destination = "${spring.activemq.queue-name}",containerFactory = "queueListener")
2. AMQP
高级消息队列协议(AMQP)是面向消息的中间件的平台中立的线级协议.
具体可参考文章:Spring Boot RabbitMQ
2.1. RabbitMQ
添加依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.2. 发送消息
使用RabbitTemplate
发送消息:
rabbitTemplate.convertAndSend(AppConstants.EXCHANGE,AppConstants.ROUTINGKEY,msg);
2.3. 接收消息
通过@RabbitListenter
监听队列
@RabbitHandler
@RabbitListener(queues = AppConstants.QUEUE)
public void process(String msg){
System.out.println("接收到队列1中的消息,内容为:"+msg);
}
3. Apache Kafka
详细可参考文章:Spring Boot Kafka
3.1. 添加依赖
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
3.2. 发送消息
kafkaTemplate.send(AppConstansts.TOPIC,msg);
3.3. 接收消息
@KafkaListener(topics = AppConstansts.TOPIC,groupId = AppConstansts.TOPIC_GROUP_1)
public void topic_1(ConsumerRecord<?,?> record, Acknowledgment ack, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic){
Optional obj = Optional.ofNullable(record.value());
if (obj.isPresent()){
Object msg = obj.get();
System.out.println("Topic_1 消费了Topic:"+topic+",Message:"+msg);
ack.acknowledge();
}
}
3.4. Kafka Strams
3.4.1. 添加依赖
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-streams</artifactId>
<version>2.2.1</version>
</dependency>
3.4.2. 配置
@Bean
public KStream<String, String> kStream(StreamsBuilder streamsBuilder){
KStream<String, String> stream = streamsBuilder.stream(AppConstansts.TOPIC_1, Consumed.with(Serdes.String(), Serdes.String()));
stream.map((key, value) -> {
value+="--huchx";
return new KeyValue<>(key,value);
}).to(AppConstansts.TOPIC_2);
return stream;
}
3.4. 附加Kafka属性
参考官网:Apache Kafka