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());
  }

}

posted on 2022-01-01 17:06  kaiker  阅读(10)  评论(0)    收藏  举报