Spring实战(第四版) 第十七章 Spring消息
1、异步消息简介


发送消息
- 消息代理,确保消息被投递到制定目的地。
- 目的地。两种通用目的地:队列和主题。点对点是队列,发布订阅是主题。
异步消息的优点
- 无需等待
- 面向消息和解耦
- 位置独立
- 确保独立
2、使用JMS发送消息
JMS是一个java标准,定义了使用消息代理的通用API
Spring通过基于模板的抽象为JMS功能提供了支持JmsTemplate
在Spring中搭建消息代理
- 创建连接工厂
- 声明目的地
使用JMS模板
public class AlertServiceImpl implements AlertService {
private JmsOperations jmsOperations;
public AlertServiceImpl(JmsOperations jmsOperations) {
this.jmsOperations = jmsOperations;
}
public void sendSpittleAlert(final Spittle spittle) {
jmsOperations.send(
"spittle.alert.queue",
new MessageCreator() {
public Message createMessage(Session session)
throws JMSException {
return session.createObjectMessage(spittle);
}
}
);
}
public void sendSpittleAlert(Spittle spittle) {
jmsOperations.convertAndSend(spittle);
}
public Spittle retrieveSpittleAlert() {
return (Spittle) jmsOperations.receiveAndConvert();
}
}
创建消息驱动POJO
- 消息监听器
public class SpittleAlertHandler {
public void handleSpittleAlert(Spittle spittle) {
System.out.println(spittle.getMessage());
}
}
再配合上一些配置

3、AMQP
AMQP可以跨语言和平台
AMQP简介

生产者到队列间有一个Exchange,定义了四种不同类型的Exchange,每一种都有不同的算法,这些算法决定了是否要讲信息放到队列中。
- Direct,消息routing key与binding的routing key匹配
- Topic,消息routing key与binding的routing key匹配
- Headers,消息参数表中的头信息与值都与binding参数表中相匹配,会路由
- Fanout,广播
配置Spring支持AMQP消息
配置RabbitMQ,一个实现了AMQP的开源消息代理
使用RabbitTemplate发送消息
public class AlertServiceImpl implements AlertService {
private RabbitTemplate rabbit;
@Autowired
public AlertServiceImpl(RabbitTemplate rabbit) {
this.rabbit = rabbit;
}
public void sendSpittleAlert(Spittle spittle) {
rabbit.convertAndSend("spittle.alert.exchange",
"spittle.alerts",
spittle);
}
}
接收AMQP消息
- 使用RabbitTemplate来接收消息
Message message = rabbit.receive("spittle.alter.queue");
<template id = "rabbitTemplate"
connection-factory = "connectionFactory"
exchange = "spittle.alert.exchange"
routing-key = "spittle.alerts"
queue = "spittle.alert.queue" />
- 定义消息驱动的AMQP POJO
还需要进行一些配置
public class SpittleAlertHandler {
public void handleSpittleAlert(Spittle spittle) {
System.out.println(spittle.getMessage());
}
}
浙公网安备 33010602011771号