springmvc+spring+maven+ActiveMq之:PuB/Sub模式

我是从上篇文章ActiveMq点对点上修改的,所以项目还是原来的,只是修改了一些配置方式和加了消费者client;
还是从配置开始:
既然是消息发布订阅就说明发布多条也可以订阅多条;所以可以用多个监听器期监控一个或者多个服务者,
这里写图片描述
两个消费者也就是监听器,以及监听主题,注意Destination在订阅发布模式用的是ActiveMQTopic
然后就是配置JMS模板(Topic)
这里写图片描述
模板中绑定了工厂,请求超时,和pubSubDomain;
最后调用DefaultMessageListenerContainer来把消费端和模板绑定监控器中实现发布之后接受的,
这里写图片描述
我这个有两个消费端所以配置了两个;启动之后就能看到一条消息被消费了两个客户端接受;
多个客户端配置方式二:
这里写图片描述
原理一样;
完整的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:amq="http://activemq.apache.org/schema/core" xmlns:jms="http://www.springframework.org/schema/jms"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.1.xsd  
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
        http://www.springframework.org/schema/jms
        http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
        http://activemq.apache.org/schema/core
        http://activemq.apache.org/schema/core/activemq-core-5.7.0.xsd ">
    <mvc:annotation-driven />
    <!-- 对包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 需要更改 -->
    <context:component-scan base-package="com.java.spring" />
    <!-- activemq连接池 -->
    <amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://localhost:61616" userName="admin" password="admin" />
    <!-- 配置JMS连接工厂 -->
    <bean id="connectionFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory">
        <constructor-arg ref="amqConnectionFactory" />
        <property name="sessionCacheSize" value="100" />
    </bean>

    <!-- 配置消息队列监听者(Topic) -->
    <bean id="activeMQTopic1" class="com.java.spring.util.listener.ActiveMQTopic1" />
    <bean id="activeMQTopic2" class="com.java.spring.util.listener.ActiveMQTopic2" />
    <bean id="demoTopicDestination" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg>
            <value>test.topic</value>
        </constructor-arg>
    </bean>

    <!-- 配置JMS模板(Topic),Spring提供的JMS工具类,它发送、接收消息。 -->
    <bean id="jmsTemplateTopic" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestination" ref="demoTopicDestination" />
        <property name="receiveTimeout" value="10000" />
<!--        true是topic,false是queue,默认是false,此处显示写出false -->
        <property name="pubSubDomain" value="true" />
    </bean>
    <!-- 定义Topic消费端方式一:方式二比较简单,方式一是在Queue方式上直接修改的-->
    <bean id="queueListenerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="demoTopicDestination" />
        <property name="messageListener" ref="activeMQTopic1" />
    </bean>
    <bean id="queueListenerContainerB"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="demoTopicDestination" />
        <property name="messageListener" ref="activeMQTopic2" />
    </bean>
    <!-- 定义Topic消费端方式二 -->
    <!-- 定义JmsTemplate的Topic类型 -->
    <!-- <bean id="jmsTemplateTopic" class="org.springframework.jms.core.JmsTemplate">
         这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象  
        <constructor-arg ref="connectionFactory" />
        pub/sub模型(发布/订阅)
        <property name="pubSubDomain" value="true" />
    </bean> -->

    <!-- 定义Topic监听器 -->
<!--    <jms:listener-container destination-type="topic" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
        <jms:listener destination="test.topic" ref="activeMQTopic1"/>
        <jms:listener destination="test.topic" ref="activeMQTopic2"/>
    </jms:listener-container> -->

</beans>

两个监听器类:

package com.java.spring.util.listener;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.jms.listener.adapter.MessageListenerAdapter;

/**
* @author 作者:zhaofq
* @version 创建时间:2017年3月28日 下午1:35:43
* 类说明
*/
public class ActiveMQTopic1 implements MessageListener {
    public void onMessage(Message message) {
        TextMessage tm = (TextMessage) message;
        try {
            System.out.println("ActiveMQTopic-----1--------监听到了文本消息:\t"+ tm.getText());
            //do something ...
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
package com.java.spring.util.listener;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.jms.listener.adapter.MessageListenerAdapter;

/**
* @author 作者:zhaofq
* @version 创建时间:2017年3月28日 下午1:35:43
* 类说明
*/
public class ActiveMQTopic2 implements MessageListener {
    public void onMessage(Message message) {
        TextMessage tm = (TextMessage) message;
        try {
            System.out.println("ActiveMQTopic---2---监听到了文本消息:\t"+ tm.getText());
            //do something ...
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

生产者:

  //默认消息目的地的方法

    public void sendMessageTopic(final String msg){
        //手动指定主题
        String queueName="test.topic";
        jmsTemplate.send(queueName, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });
          //或者默认的
        /** Destination destination = jmsTemplate.getDefaultDestination();
        jmsTemplate.send(new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });**/

     }
发布了26 篇原创文章 · 获赞 3 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览