ActiveMQ通过Topic发送异步消息

    ActiveMq是实现JMS消息服务接口的技术。处理消息的方式有基于Queue的一对一方式和基于Topic的一对多方式。

   下面是通过Topic发送常见的异步消息学习记录。

    首先下载activemq安装包,我是在window上装的。安装完后,执行安装目录下的activemq.bat启动activemq服务器。

    pom.xml依赖

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.6</version>
        </dependency>
        <!--ActiveMQ所需要的jar包 -->
        <!-- 添加ActiveMQ的pool包 -->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
            <version>5.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.9.0</version>
        </dependency>
        <!--依赖包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-messaging</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>


在springmvc配置文件applicationContext.xml添加activemq配置。

<!--ActiveMQ相关配置 -->
    <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
          destroy-method="stop">
        <property name="connectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <!--activemq消息服务连接信息 -->
                <property name="brokerURL">
                    <value>tcp://127.0.0.1:61616</value>
                </property>
                <property name="userName">
                    <value>admin</value>
                </property>
                <property name="password">
                    <value>admin</value>
                </property>
            </bean>
        </property>
        <!--最大连接数,因为上面是使用了pool -->
        <property name="maxConnections" value="100"></property>
    </bean>
    <!-- queue目的地配置 -->
    <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0" value="spring-queue" />
    </bean>
    <!-- topic目的地配置,其实不管是topic还是queue则他们的底层实现不同但是通过封装api就差不多了,而在spring中更是简单 -->
    <bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg index="0" value="spring-topic" />
    </bean>

    <!-- spring 使用jmsTemplate来实现消息的发送和接受 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsFactory"></property>
        <!--目的地的设置,使用spring来使用activemq时,使用queue还是topic很方便,在这里引用不同地址就ok了 -->
        <property name="defaultDestination" ref="destinationTopic"></property>
    </bean>

    <!--异步监听,消费者1 -->
    <bean id="consumer1" class="Consumer1">
    </bean>

    <!--异步监听,消费者2 -->
    <bean id="consumer2" class="Consumer2">
    </bean>

    <bean id="jmsContainer1"
          class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="jmsFactory" />
        <property name="destination" ref="destinationTopic" />
        <property name="messageListener" ref="consumer1" />
    </bean>

    <bean id="jmsContainer2"
          class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="jmsFactory" />
        <property name="destination" ref="destinationTopic" />
        <property name="messageListener" ref="consumer2" />
    </bean>

消息生产者:

public class QueueProducer {
    // 负责消息的发送和接收可以理解为MessageProducer 和MessageConsummer的组合。
    private static JmsTemplate jt = null;

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        // 获取JmsTemplate对象
        jt = (JmsTemplate) ctx.getBean("jmsTemplate");
        // 调用方法,发送消息
        jt.send(new MessageCreator() {
            // 消息的产生,返回消息发送消息
            public Message createMessage(Session s) throws JMSException {
                ObjectMessage msg = s
                        .createObjectMessage(new User("cj",22));
                return msg;
            }
        });
        System.out.println("Producer send message!");
    }
}

    消息消费者:

public class Consumer1 implements MessageListener {
    @Override
    public void onMessage(Message message) {
        try {
            User msg = (User)(((ObjectMessage) message).getObject());
            System.out.println("Consumer1:" + msg);
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

这里我注册了2个消费者。用来验证topic能不能一对多订阅消息。

只需要运行消息生产者的main方法,就可以了。

Producer send message!
Consumer2:User{name='cj', old=22}
Consumer1:User{name='cj', old=22}

涉及到的主要类:

ConnectionFactory :创建连接
Connection : JMS客户端与服务端的连接
Destination : 接收消息的目的地
Session : 发送和接收消息的单线程上下文
MessageProducer : 发送消息到目的地
MessageConsumer : 从目的地接收消息



ActiveMQ控制台管理页面:http://localhost:8161/

猜你喜欢

转载自blog.csdn.net/bawcwchen/article/details/80151388
今日推荐