`

spring整合activemq发送MQ消息[Topic模式]实例

 
阅读更多

http://www.cnblogs.com/dennisit/p/4552686.html

 

Topic模式消息发送实例

1、pom引入

复制代码
<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>
复制代码

2、生产者配置

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置JMS连接工厂 -->
    <bean id="providerConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="failover:(tcp://192.168.147.131:61616)" />
        <property name="useAsyncSend" value="true" />
        <property name="clientID" value="providerClienctConnect" />
    </bean>

    <!-- 定义消息Destination -->
    <bean id="topicDestination"  class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg value="testSpringTopic"/>
    </bean>

    <!-- 消息发送者客户端 -->
    <bean id="providerJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="providerConnectionFactory" />
        <property name="defaultDestination" ref="topicDestination" />
        <!-- 开启订阅模式 -->
        <property name="pubSubDomain" value="true"/>
        <property name="receiveTimeout" value="10000" />
        <!-- deliveryMode, priority, timeToLive 的开关要生效,必须配置为true,默认false-->
        <property name="explicitQosEnabled" value="true"/>
        <!-- 发送模式
             DeliveryMode.NON_PERSISTENT=1:非持久 ;
             DeliveryMode.PERSISTENT=2:持久
        -->
        <property name="deliveryMode" value="1"/>
    </bean>
    
</beans>
复制代码

生产者程序

复制代码
package com.mq.spring.topic;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import javax.jms.*;

/**
 * created on 2015/6/4
 * @author dennisit@163.com
 * @version 1.0
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-topic.xml"})
public class TopicSender {

    @Resource(name = "providerJmsTemplate")
    private JmsTemplate jmsTemplate;

    @Test
    public void send(){
        sendMqMessage(null,"spring activemq topic type message[with listener] !");
    }

    /**
     * 说明:发送的时候如果这里没有显示的指定destination.将用spring xml中配置的destination
     * @param destination
     * @param message
     */
    public void sendMqMessage(Destination destination, final String message){
        if(null == destination){
            destination = jmsTemplate.getDefaultDestination();
        }
        jmsTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(message);
            }
        });
        System.out.println("spring send text message...");
    }


    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }
}
复制代码

3、消费者配置

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!-- 配置JMS连接工厂 -->
    <bean id="consumerConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="failover:(tcp://192.168.147.131:61616)" />
        <property name="useAsyncSend" value="true" />
        <property name="clientID" value="consumerClienctConnect" />
    </bean>

    <!-- 定义消息Destination -->
    <bean id="topic1Destination"  class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg value="testSpringTopic1"/>
    </bean>

    <!-- 配置消息消费监听者 -->
    <bean id="consumerMessageListener" class="com.mq.spring.topic.ConsumerMessageListener" />

    <!-- 消息订阅客户端1 -->
    <bean id="consumerListenerClient1" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="consumerConnectionFactory" />
        <!-- 开启订阅模式 -->
        <property name="pubSubDomain" value="true"/>
        <property name="destination" ref="topic1Destination" />
        <property name="subscriptionDurable" value="true"/>
        <!---这里是设置接收客户端的ID,在持久化时,但这个客户端不在线时,消息就存在数据库里,直到被这个ID的客户端消费掉-->
        <property name="clientId" value="consumerClient1"/>
        <property name="messageListener" ref="consumerMessageListener" />
        <!-- 消息应答方式
             Session.AUTO_ACKNOWLEDGE  消息自动签收
             Session.CLIENT_ACKNOWLEDGE  客户端调用acknowledge方法手动签收
             Session.DUPS_OK_ACKNOWLEDGE 不必必须签收,消息可能会重复发送
        -->
        <property name="sessionAcknowledgeMode" value="1"/>
    </bean>

    <!-- 消息订阅客户端2 -->
    <bean id="consumerListenerClient2" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="consumerConnectionFactory" />
        <!-- 开启订阅模式 -->
        <property name="pubSubDomain" value="true"/>
        <property name="destination" ref="topicDestination" />
        <property name="subscriptionDurable" value="true"/>
        <!---这里是设置接收客户端的ID,在持久化时,但这个客户端不在线时,消息就存在数据库里,直到被这个ID的客户端消费掉-->
        <property name="clientId" value="consumerClient2"/>
        <property name="messageListener" ref="consumerMessageListener" />
        <!-- 消息应答方式
             Session.AUTO_ACKNOWLEDGE  消息自动签收
             Session.CLIENT_ACKNOWLEDGE  客户端调用acknowledge方法手动签收
             Session.DUPS_OK_ACKNOWLEDGE 不必必须签收,消息可能会重复发送
        -->
        <property name="sessionAcknowledgeMode" value="1"/>
    </bean>

</beans>
复制代码

消费者监听代码

复制代码
package com.mq.spring.topic;
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * created on 2015/6/4
 * @author dennisit@163.com
 * @version 1.0
 */
public class ConsumerMessageListener implements MessageListener{
    @Override
    public void onMessage(Message message) {
        TextMessage tm = (TextMessage) message;
        try {
            System.out.println("---------消息消费---------");
            System.out.println("消息内容:\t" + tm.getText());
            System.out.println("消息ID:\t" + tm.getJMSMessageID());
            System.out.println("消息Destination:\t" + tm.getJMSDestination());
            System.out.println("---------更多信息---------");
            System.out.println(ToStringBuilder.reflectionToString(tm));
            System.out.println("-------------------------");
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
复制代码

运行结果:

说明:属于学习,网上资料结合个人理解,理解有误的地方,期待指导和建议,共同学习.

分享到:
评论

相关推荐

    Spring集成ActiveMQ配置

    Spring集成ActiveMQ是将Spring框架与ActiveMQ消息中间件相结合,实现异步处理和解耦应用程序的关键技术。在本文中,我们将深入探讨如何配置和使用这一组合,以及它在实际项目中的应用。 首先,让我们了解Spring框架...

    jms之activeMQ 队列和广播模式例子(主要给初学者提供入门知识)

    这篇博客"jms之activeMQ 队列和广播模式例子"主要面向初学者,旨在提供ActiveMQ入门级的知识,通过实例解释队列(Queue)和主题(Topic)这两种基本的消息模式。 首先,我们要理解JMS中的队列和主题的区别。队列...

    spring+MQ消息队列

    3. **消息生产者**:在Spring应用中,我们可以创建一个`JmsTemplate`实例,用于发送消息到队列或主题。`JmsTemplate`提供了多种发送消息的方法,如`convertAndSend`,可以自动将对象转换为消息体。 4. **消息消费者...

    activemq-demo

    1. **配置文件**:Spring的XML配置文件(如`applicationContext.xml`)会包含ActiveMQ的相关配置,如`ConnectionFactory`、目的地(Queue或Topic)以及消息监听器的设置。 2. **生产者代码**:这部分代码负责创建并...

    activemq 普通版和spring版

    本项目包含了ActiveMQ的普通版和Spring整合版,让我们逐一了解这两个版本。 **普通版jmstest** 在"jmstest"中,我们看到的是ActiveMQ的纯JMS接口使用示例。JMS(Java Message Service)是Java平台上的一个标准接口...

    ActiveMQ+Spring完整详解例子

    本文将全面讲解ActiveMQ的使用流程,并结合Spring框架进行实例解析,帮助开发者深入理解如何在实际项目中部署和使用ActiveMQ。 1. **ActiveMQ的基本概念** - **消息**: 在ActiveMQ中,消息是数据传输的基本单元,...

    JMS实例,整合spring,含jar

    1. **添加依赖**:首先,你需要在项目的构建文件(如Maven的pom.xml或Gradle的build.gradle)中添加Spring和JMS相关的依赖库,包括Spring的JMS模块以及JMS提供者的特定实现,例如Apache ActiveMQ、IBM MQ或Oracle ...

    ActiveMQ的入门例子

    **Spring与ActiveMQ的整合** Spring框架提供了一套完整的支持与ActiveMQ集成的API,简化了在Spring应用中使用ActiveMQ的过程。你可以使用`JmsTemplate`来发送和接收消息,通过配置XML或Java配置来定义消息的生产者...

    编码实现MQ连接池实现JMS消息发送连接管理

    5. **发送和接收消息**:使用创建的Producer发送消息到指定的Destination(Queue或Topic),并使用Consumer从Destination接收消息。注意,为了提高效率,通常会使用MessageListener接口实现异步消息接收。 6. **...

    activemq-5.9

    2. JMS:ActiveMQ基于JMS规范,提供了多种消息模式,如点对点(Queue)、发布/订阅(Topic)以及事务处理和持久化机制。 二、ActiveMQ 5.9新特性 1. 改进的性能:5.9版本着重优化了性能,减少了内存占用并提升了...

    Active MQ in Action

    8. **集成与使用场景**:书中包含了与Spring框架、Web应用程序、EJB、 Camel以及其他中间件的集成实例,展示了ActiveMQ在实际开发中的应用。 9. **最佳实践**:提供了在生产环境中部署和管理ActiveMQ的最佳实践,...

    Spring JMS消息处理-不基于JNDI

    同样,我们可以通过创建Destination对象来指定消息发送的目标。 接下来,我们将介绍如何在Spring配置文件中进行非JNDI配置: ```xml &lt;bean id="connectionFactory" class="org.apache.activemq....

    spring-jms-demo

    6. **测试和示例代码**: 项目可能包含JUnit测试,展示如何使用Spring JMS发送和接收消息,以及如何配置不同的消息模式。 7. **Spring Boot集成**: 如今,许多Spring项目采用Spring Boot,它提供了更简洁的配置方式...

    java最新面试宝典

    - 设计模式在实际项目中的应用实例。 #### 六、Linux - **知识点概述:** - Linux基本命令的使用。 - 进程与线程的管理。 - 文件权限的设置。 - 日志文件的查看与分析。 - 系统资源的监控工具。 - **面试考察...

Global site tag (gtag.js) - Google Analytics