作用
用于消息通知,我的项目应用场景应用于分布式事务,两个微服务间的事务,通过消息通知及确认,才将事务回滚。
应用
引入POM文件
<!-- rabbitMq依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
用户模块
业务:发送消息给订单模块OrderSender
@Component
public class OrderSender {
@Autowired
private RabbitTemplate rabbitTemplate;
private final RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
String messageId = correlationData.getId();
if(ack){
// 如果confirm返回成功,则进行更新
//更新消息状态
JdbcTemplateCommon.getJdbcTemplate().execute("update purchasecloud_common set messageId = '1' where message_id = '"+messageId+"'");
System.out.println("更新messageId成功");
}else{
throw new RuntimeException("消息返回不成功(订单模块)");
}
}
};
/**
* 发送订单
* @param order 订单
*/
public void send(SrmOrderHeader order) {
// 设置回调方法
this.rabbitTemplate.setConfirmCallback(confirmCallback);
// 消息ID
CorrelationData correlationData = new CorrelationData(order.getMessageId());
// 发送消息
this.rabbitTemplate.convertAndSend(Exchange.ORDER_EXCHANGE, RoutingKey.ORDER_SEND, order, correlationData);
}
}
订单模块
业务:订单模块接收用户模块消息,进行处理
@Component
public class OrderReceiver {
// 绑定监听,可以在未配置的情况下,在平台自动生成
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = com.purchasecloud.srm.rabbitmq.entity.Queue.ORDER_QUEUE,
durable="true"),
exchange = @Exchange(value = com.purchasecloud.srm.rabbitmq.entity.Exchange.ORDER_EXCHANGE,
durable="true",
type= "topic",
ignoreDeclarationExceptions = "true"),
key = "order.*"
)
)
// 手动签收必须依赖channel
@RabbitHandler // 标识该方法,如果有消息过来,消费者调用该方法
public void onOrderMessage(@Payload SrmOrderHeader order,
@Headers Map<String, Object> headers,
Channel channel) throws Exception{
// 消费者操作
System.err.println("-----------------------收到消息,用户开始消费----------------------------");
System.out.println("用户模块对订单进行处理");
System.err.println("订单ID:"+ order.getId());
Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG) ;
// ACK
channel.basicAck(deliveryTag, false);
}
}
静态变量类
交换机
/**
* 交换机
* Created by ShenYiDong on 2019/7/29
*/
public class Exchange {
//订单交换机
public static final String ORDER_EXCHANGE = "order_exchange";
}
业务key
/**
* routing key 业务对应的key
* Created by ShenYiDong on 2019/7/29
*/
public class RoutingKey {
//订单业务key
public static final String ORDER_SEND = "order.send";
}
订单Queue
/**
* Created by ShenYiDong on 2019/7/29
*/
public class Queue {
//订单
public static final String ORDER_QUEUE = "order_queue";
}