分布式-信息方式-ActiveMQ结合Spring

                   ActiveMQ结合 Spring开发
■ Spring提供了对JMS的支持,需要添加 Spring支持jms的包,如下:

<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

代码如下:

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mq.test</groupId>
  <artifactId>activeMQ</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>activeMQ</name>
  <url>http://maven.apache.org</url>

   
<!-- 设置公共属性,可以被引用 ${attribute} -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>4.11</junit.version>
    <spring.version>3.2.0.RELEASE</spring.version>
    <httpclient.version>4.3.1</httpclient.version>
  </properties> 
  
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-all</artifactId>
    </dependency>
     <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-pool</artifactId>
    </dependency>
       <!-- spring 核心JAR包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
        <!-- spring事务 https://mvnrepository.com/artifact/org.springframework/spring-tx -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
         <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>

         <dependency>
             <groupId>org.aspectj</groupId>
             <artifactId>aspectjrt</artifactId>
             <version>1.7.4</version>
         </dependency>
  </dependencies>
  <dependencyManagement>
      <dependencies>
          <dependency>
              <groupId>org.apache.activemq</groupId>
              <artifactId>activemq-all</artifactId>
              <version>5.11.1</version>
          </dependency>
          <dependency>
              <groupId>org.apache.activemq</groupId>
              <artifactId>activemq-jms-pool</artifactId>
              <version>5.11.1</version>
          </dependency>
          <dependency>
              <groupId>org.apache.activemq</groupId>
              <artifactId>activemq-pool</artifactId>
              <version>5.11.1</version>
          </dependency>
          <dependency>
              <groupId>org.apache.activemq</groupId>
              <artifactId>activemq-client</artifactId>
              <version>5.11.1</version>
          </dependency>
             <!-- spring 核心JAR包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
        <!-- spring事务 https://mvnrepository.com/artifact/org.springframework/spring-tx -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>
      </dependencies>
  </dependencyManagement>
</project>
<?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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
           http://www.springframework.org/schema/aop   
           http://www.springframework.org/schema/aop/spring-aop-3.2.xsd  
           http://www.springframework.org/schema/tx  
           http://www.springframework.org/schema/tx/spring-tx-3.2.xsd  
           http://www.springframework.org/schema/context  
           http://www.springframework.org/schema/context/spring-context-3.2.xsd"
    default-autowire="byName" default-lazy-init="false">

    <context:component-scan base-package="com.mq.test.activeMQ">
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
    <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"  destroy-method="stop">
        <property name="connectionFactory">
             <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                   <property name="brokerURL">
                         <value>tcp://localhost:61616</value>
                   </property>
             </bean>
        </property>
        <property name="maxConnections" value="100"></property>
    </bean>
    
    <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
    <!-- 队列模板 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
        <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
        <property name="connectionFactory" ref="jmsFactory"/>  
        <property name="defaultDestination" ref="destination"></property>
        <property name="messageConverter">
             <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"></bean>
        </property>
    </bean> 
     <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"  >
            <constructor-arg index="0" value="spring-queue"></constructor-arg>
     </bean>
     <!-- 
    <bean  id="broker" class="org.apache.activemq.broker.BrokerService" init-method="start" destroy-method="stop">
         <property name="brokerName" value="myBroker" />
         <property name="persistent" value="false"></property>
         <property name="transportConnectorURIs"  >
                 <list>
                      <value>tcp://localhost:61616</value>
                 </list>
         </property> 
    </bean>
    -->
     
     

</beans>

信息发送者

package com.mq.test.activeMQ.spring;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
@Service
public class QueueSender {
  @Autowired
   private JmsTemplate jt=null;
   public static void main(String[] args) {
       ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
       QueueSender  ct=  (QueueSender) ctx.getBean("queueSender");
       ct.jt.send(new MessageCreator() {
        public Message createMessage(Session s) throws JMSException {
             TextMessage msg=s.createTextMessage("Spring msg===");
            return msg;
        }
    });
   }
}

信息消费者

package com.mq.test.activeMQ.spring;

 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
 
@Service
public class QueueReceiver {
    @Autowired
       private JmsTemplate jt=null;
       public static void main(String[] args) {
           ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
           QueueReceiver ct= (QueueReceiver) ctx.getBean("queueReceiver");
           String msg=(String) ct.jt.receiveAndConvert();
           System.out.println("msg===="+msg);
          
       }
}

■如果 topic的话,首先需要修改 spring的配置:
先添加 topic的配置,当然,需要修改 jmsTemplate配置里面的
defaultDestination,如果不想修改这个配置,那么直接把 Destination注入程序,在程序
里面选择发送的 Destination也可以

<bean id="destinationtopic" class="org.apache.activemq.command.ActiveMQTopic" >
<constructor-arg index="0" value="spring-topic"></constructor-arg>
</bean>

其他的客户端发送和接收跟队列基本是一样的。
■如果想要在 Spring中配置消费者的话,就不需要再启动接收的客户端了,配置如下:

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<property name="connectionFactory" ref="jmsFactory"/>
<property name="defaultDestination" ref="destinationtopic"></property>
<property name="messageConverter">
<bean class="org.springframework.jms.support.converter.SimpleMessageConverter"></bean>
</property>
</bean>

代码如下:

package com.mq.test.activeMQ.spring;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
@Service
public class TopicSender {
  @Autowired
   private JmsTemplate jt=null;
   public static void main(String[] args) {
       ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
       TopicSender  ct=  (TopicSender) ctx.getBean("topicSender");
       ct.jt.send(new MessageCreator() {
        public Message createMessage(Session s) throws JMSException {
             TextMessage msg=s.createTextMessage("Spring msg===");
            return msg;
        }
    });
   }
}
package com.mq.test.activeMQ.spring;

 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
 
@Service
public class TopicReceiver {
    @Autowired
       private JmsTemplate jt=null;
       public static void main(String[] args) {
           ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
           TopicReceiver ct= (TopicReceiver) ctx.getBean("topicReceiver");
           String msg=(String) ct.jt.receiveAndConvert();
           System.out.println("msg===="+msg);
          
       }
}

ActiveMq结合 Spring开发最实践和建议
1: Camel框架支持大量的个业集成模式,可以大大简化集成组件间的大量服务和复
杂的消息流。而 Spring框架更注重简单性,仅仅支持基本的最佳实践
2: Spring消息发送的核心架构是 JmsTemplate,隔离了像打开、关闭 Session和
Produce1r的繁琐操作,因此应用发人员仅仅需要关注实际的业务逻辑。但是
JmsTemplate损害了 ActiveMQ的 Pooledconnectionfactory对 session和消息
producer的缓存机制而带来的性能提升
3:新的Sp1ing里面,可以设置
org. springframework jms connection. CachingConnectionFactory的
sessioncachesize,或者干脆使用]ActiveMQ的 PooledConnectionFactory
4:不建议使用 JmsTemplate的receive()调用,因为在 JmsTemplate 上的所有调用都
是同步的,这意味袷调用线程需要被阻塞,直到方法返回|,这对性能影响很大
5:请使用 DefaultMessageListenerContainer,它允许异步接收消息并缓存 session
和消息 consumer,而且还可以根据消息数量动态的增加或缩减监听器的数量

原文地址:https://www.cnblogs.com/caoyingjielxq/p/9342563.html