zoukankan      html  css  js  c++  java
  • 【Spring】使用Spring和AMQP发送接收消息(下)

    上篇讲了使用RabbitMQ发送消息,本篇则来讲接收消息。
    在传统JMS中有两种从队列获取信息的方式,使用JmsTemplate的同步方式以及使用消息驱动pojo的异步方式。Spring AMQP也提供了类似的方式来获取通过AMQP发送的消息。

    使用RabbitTemplate来接收消息

    RabbitTemplate提供的接收信息的方法中最简单的就是receive()方法,通过该方法就可以从队列中获取一个Message对象:

    Message message = rabbit.receive("spittle.test.queue");

    或者也可以通过配置获取消息的默认队列,这是通过在配置模板的时候,设置queue属性实现的:

    <template id="rabbitTemplate" 
        connection-factory="connectionFactory"
        exchange="spittle.test.exchange" 
        routing-key="spittle.test" 
        queue="spittle.test.queue" />

    这样的话,在调用receive()方法时,不需要设置任何参数就能从默认队列中获取消息:

    Message message = rabbit.receive( );

    获取到Message对象后,一般需要将它的body属性中的字节数组转换为想要的对象,就像在发送的时候将领域对象转换为Message一样,将接收到的Message转换为领域对象也很繁琐。这里可以考虑使用RabbitTemplate的receiveAndConvert()方法作为替代方案:

    Spittle spittle = (Spittle) rabbit.receiveAndConvert("spittle.test.queue");

    receiveAndConvert()方法会使用与sendAndConvert()方法相同的消息转换器,将Message对象转换为原始的类型。
    调用receive()和receiveAndConvert()方法都会立即返回,如果队列中没有等待的消息,将会得到null。这时一般需要程序员自己管理轮询以及必要的线程,实现队列监控。如果不想每次都同步轮询等待消息到达,可以使用Spring AMQP提供的消息驱动pojo,下面就看看使用消息驱动pojo的方式来接收消息。

    使用消息驱动pojo来接收消息

    如果想要在消息驱动pojo中异步地消费使用Spittle对象,先要解决这个pojo本身,如下的SpittleTestHandler扮演了这个角色:

    public class SpittleTestHandler {
        public void handleSpittleTest (Spittle spittle) {
            ...
        }
    }

    其实这个类并没有依赖于AMQP,不管通过什么机制传递过来Spittle对象,它都能够处理。
    这里还需要在Spring应用上下文中将SpittleTestHandler声明为一个bean:

    <bean id="spittleListener"
        class="com.***.spittr.test.SpittleTestHandler">

    最后要声明一个监听器容器和监听器,当消息到达的时候,能够调用SpittleTestHandler,配置如下:

    <listener-container connection-factory="connectionFactory">
        <listener ref="spittleListener" 
              method="handleSpittleTest"
              queue-names="spittle.test.queue" />
    </listener-container>

    上面的<listener-container>与<listener>元素都来自rabbit命名空间。并通过queue-names属性来指定要监听的队列,这里只设定了一个要监听的队列,如果要设置多个队列的话,用逗号隔开。到这里消息接收就完成了,拿到消息后就可以在相应方法里执行相应处理了。

  • 相关阅读:
    poj3984 迷宫问题(简单搜索+记录路径)
    substr
    poj3087 Shuffle'm Up
    学生管理系统
    win10配置gcc编译环境
    poj3278 Catch That Cow
    将字符串str1复制为字符串str2的三种解决方法
    poj2251 Dungeon Master
    cf 410
    7.20 Codeforces Beta Round #8
  • 原文地址:https://www.cnblogs.com/weknow619/p/6955321.html
Copyright © 2011-2022 走看看