• SpringInAction 第八章 发送异步消息


    相关源码位于 https://github.com/AganRun/SpringInAction

    第八章 发送异步消息

    8.1 使用JMX发送消息

    JMX是一个标准,定义了消息代理(message broker)的通用API,就想JDBC为数据库访问提供了通用接口一样。
    JMX长期以来一直是异步消息首选方案。

    8.1.1 搭建JMX环境

    启动器可以使用ActiveMQ或者ActiveMQ Artemis(重新实现的下一代ActiveMQ)。

    • Artemis:默认情况下运行在61616端口

    8.1.2 使用JmsTemplate发送消息

    JmsTemplate是Spring对JMS集成支持功能的核心,与其他模块类似,消除了大量传统使用方式的样板代码

    public void send(MessageCreator messageCreator);
    public void send(Destination destination, MessageCreator messageCreator);
    public void send(String destinationName, MessageCreator messageCreator);
    
    public void convertAndSend(Object message);
    public void convertAndSend(Destination destination, Object message);
    public void convertAndSend(String destinationName, Object message);
    
    public void convertAndSend(Object message, MessagePostProcessor postProcessor);
    public void convertAndSend(Destination destination, Object message, MessagePostProcessor postProcessor);
    public void convertAndSend(String destinationName, Object message, MessagePostProcessor postProcessor);
    
    三种发送
    • send()需要MessageCreator生成Message对象

    • covertAndSend()接受Object对象,自动转为Message

      这个自动转换的操作是通过MessageConverter实现的,Spring定义了接口

        Message toMessage(Object var1, Session var2)
        Object fromMessage(Message var1)
      

      默认有四种实现类。

      • MappingJackson2MessageConverter 与JSon的转换
      • MarshallingMessageConverter 与XML的转换
      • MessagingMessageConverter
      • SimpleMessageConverter(默认)
    • covertAndSend()自动Object->Message,并且接受一个MessagePostProcessor对象,用来发送前对Message进行定义

      可以对消息进行后期处理,比如可以统一加上便于区分的头信息

        jmsTemplate.convertAndSend(message, new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws JMSException {
                message.setStringProperty("X_SOURCE", "MASTER");
                return message;
            }
        });
      
    三个重载方法
    • 一个方法不接受目的地参数,会发送至默认目的地
    • 一个方法接受Destination对象,该对象指定了目的地
    • 接受String,他通过名字指定消息目的地

    默认目的地spring.jms.template.default-destination=taco.queue

    8.1.3 接收JMS消息

    一半有两种消费模式

    1. 拉取模式
      一直等待消息到达。比如说后厨准备好做下一道菜,点击接收。
      如果消息少,会导致等待阻塞。
    2. 推送模式 @JmsListener
      在消息可用时自动执行,通常被视为最佳选择,因为不会导致阻塞。
      如果消息太快处理不完,监听器可能过载。

    JmsTemplate都是拉取模式,如果消息能够快速得到处理,那么他们是非常适合的方案。
    但是,如果消息处理器需要根据自己的时间请求更多信息,拉取模式更适合。

    JMS作为JAVA规范只能运行在Java应用中,RabbitMQ和Kafka等较新的消息传递方案克服了这类问题。

    8.2 使用RabbitMQ和AMQP

    RabbitMq可以说是AMQP(Advanced Message Queuing Protocol, 高级消息队列协议)最杰出的实现,提供了比JMS更高级的消息路由策略。

    RabbitMq

    消息抵达MQ代理时,会进入设置的Exchange上,Exchange负责将它路由到一个或多个队列中去。
    这个过程会根据exchange的类型、exchange和队列之前的binding以及消息的routing Key进行路由。

    具体可以参考《RabbitMQ in Action》Alvaro Videla、Jason J.W.Williams。使用方法和JmsTemplate类似。

    8.3 使用Kafka的消息

    Kafka

    详情可以阅读《Kafka in Action》-Dylan Scott。

  • 相关阅读:
    有关LinkedList常用方法的源码解析
    [Kotlin参考]一、总览-(7)多平台编
    [Kotlin参考]一、总览-(3)Kotlin for JavaScript
    [Kotlin参考]一、总览-(4)Kotlin原生
    [Kotlin参考]一、总览-(5)Kotlin数据科学
    [Kotlin参考]一、总览-(2)Android版Kotlin
    [Kotlin参考]一、总览-(1)服务器端Kotlin
    [Swift]LeetCode1312. 让字符串成为回文串的最少插入次数 | Minimum Insertion Steps to Make a String Palindrome
    [Swift]LeetCode1311. 获取你好友已观看的视频 | Get Watched Videos by Your Friends
    [Swift]LeetCode1310. 子数组异或查询 | XOR Queries of a Subarray
  • 原文地址:https://www.cnblogs.com/AganRun/p/13352939.html
Copyright © 2020-2023  润新知