• 分布式-信息方式-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,而且还可以根据消息数量动态的增加或缩减监听器的数量

  • 相关阅读:
    XToDo未完成内容标记管理器
    FuzzyAutocomplete代码模糊匹配智能提示
    KSImageNamed项目图片智能提示
    Backlight当前行背景高亮显示
    VVDocumenter规范注释生成器
    window.frames[]在Firefox下无法兼容的解决方式
    加密算法(扩展知识:Base64编码)
    Single Pattern(单例模式)
    C语言的基本数据类型长度
    移位操作和二进制知识
  • 原文地址:https://www.cnblogs.com/caoyingjielxq/p/9342563.html
Copyright © 2020-2023  润新知