ActiveMQ学习(三)--结合Spring的Demo

来源:互联网 发布:艾克里里淘宝店链接 编辑:程序博客网 时间:2024/03/29 22:21

花了半天的时间搞了一个Spring+struts2+ActiveMQ的小demo,界面就直接用的inde.jsp,没有任何的样式,另外jar包也有一些多余的,不管那么多了,下面聊聊如何通过Spring去构造一个消息接收机制。

  • ActiveMQ在Spring中的配置

    先贴一下我的案例中的配置吧,再一一解释下到底是什么鬼:

    1. <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
    2. <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    3. <property name="brokerURL" value="failover:(tcp://localhost:61616?wireFormat.maxInactivityDuration=0)&amp;maxReconnectDelay=10000"/>
    4. <property name="optimizedAckScheduledAckInterval" value="10000" />
    5. </bean>
    6. <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
    7. <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
    8. <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
    9. <property name="targetConnectionFactory" ref="targetConnectionFactory"/>
    10. </bean>
    11. <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
    12. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    13. <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
    14. <property name="connectionFactory" ref="connectionFactory"/>
    15. </bean>
    16. <!--这个是队列目的地-->
    17. <bean id="alarmWebQueue" class="org.apache.activemq.command.ActiveMQTopic">
    18. <constructor-arg>
    19. <value>alarmWebQueue</value>
    20. </constructor-arg>
    21. </bean>
    22. <!-- 消息监听器 -->
    23. <bean id="webMessageListener" class="com.gh.test.mq.receive.WebMessageReceiver" />
    24. <!-- 消息监听容器 -->
    25. <bean id="jmsWebContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    26. <property name="connectionFactory" ref="connectionFactory" />
    27. <property name="destination" ref="alarmWebQueue" />
    28. <property name="messageListener" ref="webMessageListener" />
    29. </bean>

    1. 配置ConnectionFactory

    Spring提供的ConnectionFactory只是Spring用于管理ConnectionFactory的,真正产生到JMS服务器链接的ConnectionFactory还得是由JMS服务厂商提供,并且需要把它注入到Spring提供的ConnectionFactory中。我们这里使用的是ActiveMQ实现的JMS,所以在我们这里真正的可以产生Connection的就应该是由ActiveMQ提供的ConnectionFactory。

    2. 配置生产者

    配置好ConnectionFactory之后我们就需要配置生产者。生产者负责产生消息并发送到JMS服务器。但是我们要怎么进行消息发送呢?通常是利用Spring为我们提供的JmsTemplate类来实现的,所以配置生产者其实最核心的就是配置消息发送的JmsTemplate。对于消息发送者而言,它在发送消息的时候要知道自己该往哪里发,为此,我们在定义JmsTemplate的时候需要注入一个Spring提供的ConnectionFactory对象。
    上面所说的队列目的地,其实就是一个Destination,就是我这个消息发送到哪里去,这里呢,一般有2种配置:一个是点对点的ActiveMQQueue,另一个就是支持订阅/发布模式的ActiveMQTopic。(区别后面有机会再去深入讲下),这里是配的topic。

    3. 配置消费者

    生产者往指定目的地Destination发送消息后,接下来就是消费者对指定目的地的消息进行消费了。那么消费者是如何知道有生产者发送消息到指定目的地Destination了呢?每个消费者对应每个目的地都需要有对应的MessageListenerContainer。对于消息监听容器而言,除了要知道监听哪个目的地之外,还需要知道到哪里去监听,也就是说它还需要知道去监听哪个JMS服务器,通过配置MessageListenerContainer的时候往里面注入一个ConnectionFactory来实现的。所以我们在配置一个MessageListenerContainer的时候有三个属性必须指定:一个是表示从哪里监听的ConnectionFactory;一个是表示监听什么的Destination;一个是接收到消息以后进行消息处理的MessageListener。这里就对应上面的三个property。

  • 部分代码分析

    1. 生产者

    生产者的代码有很多情况,那么我们核心的思想就是在满足一定条件的时候去生成一条消息,推送到目的地,让消费者能够看到。我这里的demo,其实就是通过页面上点击一下,出发action里面定义好的一个方法去发送消息。

    1. @Resource
    2. private Destination alarmWebQueue;
    3. @Resource
    4. private JmsTemplate jmsTemplate;
    5. public String sendMessage() {
    6. try{
    7. jmsTemplate.send(alarmWebQueue, new MessageCreator() {
    8. public Message createMessage(Session session) throws JMSException {
    9. MapMessage msg = session.createMapMessage();
    10. msg.setString("id", "1001");
    11. msg.setString("name", "浩浩");
    12. msg.setString("value", "你好啊");
    13. return msg;
    14. }
    15. });
    16. msg="发送成功";
    17. }catch(Exception e){
    18. msg="发送失败";
    19. e.printStackTrace();
    20. }
    21. return "success";
    22. }

    这里我们通过注解的方式引入了得到了Destination和JmsTemplate,直接调用jmsTemplate的send方法就行。这里的send方法也是有很多的构造方法,因为我在前面配置的时候没有给JmsTemplate引入目的地alarmWebQueue,所以我这里要传一个Destination作为参数。至于这个message,也是有多重形式的,不止有MapMessage,不过要跟你的消费者互相对应起来,不然解析不了具体的消息内容。

    2. 消费者

    消费者的代码其实就是一个类实现MessageListener接口,实现里面的onMessage方法,在这里面可以去实现具体的业务逻辑。

    1. public class WebMessageReceiver implements MessageListener {
    2. // 打印日志
    3. private static Logger log = Logger.getLogger(WebMessageReceiver.class);
    4. public void onMessage(Message message) {
    5. log.info("web端发送消息接收");
    6. try {
    7. MapMessage mapMsg = (MapMessage) message;
    8. log.info("消息内容中ID是:" + mapMsg.getString("id"));
    9. log.info("消息内容中NAME是:" + mapMsg.getString("name"));
    10. log.info("消息内容中VALUE是:" + mapMsg.getString("value"));
    11. } catch (JMSException e) {
    12. log.error("接受出错:"+e.getMessage());
    13. }
    14. }
    15. }

代码实现起来是不难的,主要是要动手去写一下,去做一下,等你能理解了这个过程才能更好的去结合实际场景运用。

0 0
原创粉丝点击