JMS结合ActiveMQ实现消息传递

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caox_nazi/article/details/86307527

JMS结合ActiveMQ实现消息传递

【定义概念】: 参考文献:java消息服务使用总结(JMS:通过ActiveMQ实现)

【JDBC-持久化方式】 (一种ActiveMQ消息持久化机制):

修改/conf/activemq.xml配置文件,首先定义一个mysql-ds的MySQL数据源,然后在persistenceAdapter节点中配置jdbcPersistenceAdapter并且引用刚才定义的数据源。dataSource指定持久化数据库的bean,createTablesOnStartup是否在启动的时候创建数据表,默认值是true,这样每次启动都会去创建数据表了,一般是第一次启动的时候设置为true,之后改成false。

<persistenceAdapter>
    <!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
	<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false"/>
</persistenceAdapter>

在broker节点后添加数据源配置:

</broker>
	
<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
	<property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
	<property name="url" value="jdbc:mysql://localhost/activemq"/>
	<property name="username" value="root"/> 
	<property name="password" value="123456"/> 
	<property name="poolPreparedStatements" value="true"/> 
</bean>

【说明】: 上述数据源中的 class="org.apache.commons.dbcp2.BasicDataSource"配置是 本实例运用activemq版本是5.15.8(高版本);低版本的MQ应该是 org.apache.commons.dbcp.BasicDataSource;最后将mysql驱动jar包放入apache-activemq-5.15.8/lib下即可

首次启动后就会看到数据库的创建的三张表:

【pom依赖】:

<!--activemq-->
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-all</artifactId>
      <version>5.14.1</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jms</artifactId>
      <version>4.0.8.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-messaging</artifactId>
      <version>4.0.8.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-spring</artifactId>
      <version>5.14.1</version>
    </dependency>

【spring-activemq.xml】 配置:【待解决】:发现activemq配置启动和rabbitmq配置ConnectionFactory冲突,暂时注释掉启动配置中的rabbitmq配置即可

<?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: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-4.0.xsd
        http://www.springframework.org/schema/jms
        http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
        http://activemq.apache.org/schema/core
        http://activemq.apache.org/schema/core/activemq-core-5.14.1.xsd">
    <description>spring-activeMQ</description>
    <!-- 获取ActiveMQ提供的ConnectionFactory -->
    <amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://127.0.0.1:61616" userName="admin" password="admin"></amq:connectionFactory>

    <!-- spring连接activeMQ的conneciotnFactory -->
    <bean id="activeMQConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <constructor-arg ref="amqConnectionFactory"></constructor-arg>
        <property name="sessionCacheSize" value="100" />
    </bean>

    <!-- 定义JmsTemplate的Queue类型 -->
    <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
        <constructor-arg ref="activeMQConnectionFactory"></constructor-arg>
        <!-- 非pub/sub模型(发布/订阅),即队列模式 -->
        <property name="pubSubDomain" value="false" />
    </bean>

    <!-- 定义JmsTemplate的Topic类型 -->
    <bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
        <constructor-arg ref="activeMQConnectionFactory"></constructor-arg>
        <!-- pub/sub模型(发布/订阅) -->
        <property name="pubSubDomain" value="true" />
    </bean>


    <bean id="queueReceiver" class="com.caox.activemq.annotation.queue.QueueReceiver"></bean>
    <!-- 定义Queue监听器 -->
    <jms:listener-container destination-type="queue" container-type="default" connection-factory="activeMQConnectionFactory" acknowledge="auto">
        <jms:listener destination="test.queue" ref="queueReceiver"/>
    </jms:listener-container>

    <bean id="topicReceiver" class="com.caox.activemq.annotation.topic.TopicReceiver"></bean>
    <!-- 定义Topic监听器 -->
    <jms:listener-container destination-type="topic" container-type="default" connection-factory="activeMQConnectionFactory" acknowledge="auto">
        <jms:listener destination="test.topic" ref="topicReceiver"/>
    </jms:listener-container>
</beans>

【spirng配置监听消息】 -【queue发送和消费服务】:

  (1)生产者:

package com.caox.activemq.annotation.queue;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

/**
 * @author : nazi
 * @version : 1.0
 * @date : 2019/1/11 14:28
 */
@Component("queueSender")
@Slf4j
public class QueueSender {
    @Autowired
    @Qualifier("jmsQueueTemplate")
    private JmsTemplate jmsTemplate;

    public void send(String queueName, final String message){
        log.info("call 发送 activemq queue 消息 | queueName:{} message:{}",queueName, message);
        jmsTemplate.send(queueName, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(message);
            }
        });
    }
}

(2)消费者:

package com.caox.activemq.annotation.queue;

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

/**
 * @author : nazi
 * @version : 1.0
 * @date : 2019/1/11 14:22
 */
public class QueueReceiver implements MessageListener {
        @Override
        public void onMessage(Message message) {
            try {
                System.out.println("QueueReceiver接收到消息:"+((TextMessage)message).getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

【spirng配置监听消息】 -【topic发送和消费服务】: 

(1)生产者:

package com.caox.activemq.annotation.topic;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

/**
 * @author : nazi
 * @version : 1.0
 * @date : 2019/1/11 14:30
 */
@Component("topicSender")
@Slf4j
public class TopicSender{
    @Autowired
    @Qualifier("jmsTopicTemplate")
    private JmsTemplate jmsTemplate;
    public void send(String queueName, final String message){
        log.info("call 发送 activemq topic 消息 | queueName:{} message:{}",queueName, message);
        jmsTemplate.send(queueName,new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(message);
            }
        });
    }
}

(2)消费者:

package com.caox.activemq.annotation.topic;

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

/**
 * @author : nazi
 * @version : 1.0
 * @date : 2019/1/11 14:32
 */
public class TopicReceiver implements MessageListener{
    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("TopicReceiver接收到消息:"+((TextMessage)message).getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

【参考文献】:ActiveMQ的几种消息持久化机制 

猜你喜欢

转载自blog.csdn.net/caox_nazi/article/details/86307527