zoukankan      html  css  js  c++  java
  • spring整合MQ

    ---恢复内容开始---

    一、 导入依赖
    <dependencies>
           <!-- ActiveMQ客户端完整jar包依赖 -->
           <dependency>
               <groupId>org.apache.activemq</groupId>
               <artifactId>activemq-all</artifactId>
               <version>5.9.0</version>
           </dependency>
           <!-- ActiveMQ和Spring整合配置文件标签处理jar包依赖 -->
           <dependency>
               <groupId>org.apache.xbean</groupId>
               <artifactId>xbean-spring</artifactId>
               <version>4.5</version>
           </dependency>
           <!-- Spring-JMS插件相关jar包依赖 -->
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-jms</artifactId>
               <version>4.1.6.RELEASE</version>
           </dependency>
           <!-- Spring框架上下文jar包依赖 -->  严重怀疑这个不用
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-context</artifactId>
               <version>4.1.6.RELEASE</version>
           </dependency>
           <!-- SpringMVC插件jar包依赖 -->
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
               <version>4.1.6.RELEASE</version>
           </dependency>
        </dependencies>
      <build>
           <plugins>
               <!-- 配置Tomcat插件 -->  这个可以不用
               <plugin>
                  <groupId>org.apache.tomcat.maven</groupId>
                  <artifactId>tomcat7-maven-plugin</artifactId>
                  <version>2.2</version>
                  <configuration>
                      <port>9099</port>
                      <path>/</path>
                  </configuration>
               </plugin>
           </plugins>
        </build>
     
     
     
    二、 定义pojo  Order.class
    package cn.gzsxt.jms.pojo;
     
    import java.io.Serializable;
    import java.util.Date;
     
    /**
     * 定义消息载体类型. 即要在ActiveMQ中传递的数据实体类型.
     * 消息载体对象必须实现接口java.io.Serializable, 因为消息需要在网络中传递,要求必须可序列化
     * 
     * @author lyq
     
    public class Order implements Serializable{
                                选第二个
        private static final long serialVersionUID = 4631909346042146827L;
     
        private String id;
        private String nick;
        private Long price;
        private Date createTime;
        public Order() {
           super();
           // TODO Auto-generated constructor stub
        }
        get  set  方法
        @Override
        public String toString() {
           return "Order [id=" + id + ", nick=" + nick + ", price=" + price + ", createTime=" + createTime + "]";
        }
    }
     
     
    三、 定义消费者 OrderReciever.java
     
    /**
     * 消息消费者代码, 此类型实现接口MessageListener, 用于监听处理ActiveMQ服务中的消息
     *
     * @author lyq
     */
    @Component
    public class OrderReciever implements MessageListener{
             @Override  实现的方法
             public void onMessage(Message message) {
                      try{
                              ObjectMessage objectMassage = (ObjectMessage) message;
                              Order order = (Order) objectMassage.getObject();
                              /**
                               * 模拟将订单写入数据库
                               */
                              System.out.println("the order is : " + order);
                      }catch(Exception e){
                              e.printStackTrace();
                      }
             }
    }
     
     
    四 、定义生产者OrderProducer.java
     
    @Component
    public class OrderProducer {
     
        @Autowired   //Autowired是根据类型注入值。
        private JmsTemplate jmsTemplate;    jms处理实现类通过这个类可以发送数据到队列里
        
        @Value("${MQ_QUEUE}")
        private String MQ_QUEUE;
        
        public void sendToMQ(final Order order){  匿名内部类要访问外部变量需要final
            jmsTemplate.send(MQ_QUEUE, new MessageCreator() {
                
                @Override
                public Message createMessage(Session session) throws JMSException {
                    
                    Message message = session.createObjectMessage(order);
                    
                    return message;
                }
            });
        }
    }
    等同于
     
                  //4. 创建目的地, 目的地命名即队列命名, 消息消费者需要通过此命名访问对应的队列
                    destination  =  session.createQueue("text-msg");
                    // 5. 创建消息生成者, 创建的消息生成者与某目的地对应, 即方法参数目的地.
                    producer = session.createProducer(destination);
                    //6 .创建消息对象 创建一个文本消息, 此消息对象中保存要传递的文本数据.
                    message = session.createTextMessage(msg);        //createTextMessage  因为是文本信息
                    //7.将消息对象发送到队列
                    producer.send(message);
     
    五 、 定义Controller
    @Controller
    @RequestMapping("/order")
    public class OrderController {
     
        @Autowired
        private OrderProducer orderProducer;
        
        @RequestMapping(value="/save.do",method=RequestMethod.POST)
        public String save(Order order){
            
            orderProducer.sendToMQ(order);
            
            return "/success.jsp";
        }
    }
     
     
     
    六  、 Spring整合Mq
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
       
        xmlns:amq(core)="http://activemq.apache.org/schema/core"
        xmlns:jms ="http://www.springframework.org/schema/jms"
     
     
        <!-- ActiveMQ  真实连接工厂 -->
        <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
        <!-- 需提供访问路径tcp://ip:61616;以及用户名,密码 -->
        <amq:connectionFactory id="amqConnectionFactory"
           brokerURL="tcp://192.168.56.4:61616" userName="admin" password="admin" />
     
        <!-- Spring Caching连接工厂 -->
        <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
        <bean id="connectionFactory"
            class="org.springframework.jms.connection.CachingConnectionFactory">
          
    <!-- 对应真实的可以产生JMS Connection的ConnectionFactory -->
           <property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
           <!-- 可以设置Session缓存数量 -->
           <property name="sessionCacheSize" value="100" />
        </bean>
     
        <!-- 消息生产者模板对象的生成 -->
     
        <!-- 定义JmsTemplate对象. 此类型由Spring框架JMS组件提供. 用于访问ActiveMQ使用. -->
        <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
           
    <!--这里对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
    他需要提供一个连接工厂给对象,才知道那个连接
           <constructor-arg  ref="connectionFactory" />
           <!-- 非pub/sub模型(发布/订阅),即队列模式, 默认数据可省略配置 -->
           <!-- <property name="pubSubDomain" value="false" /> -->
        </bean>
       
        <!-- 定义生成者对象 -->
        <bean id="orderProducer" class="cn.gzsxt.jms.producer.OrderProducer">
           <!-- 为属性赋值 -->
           <property name="template" ref="jmsQueueTemplate"></property>
        </bean>
       
        <!--消息生产者 end -->
     
        <!-- 消息消费者 start -->
     
        <!-- 定义消息监听器, 此组件为spring-jms组件定义. 可以一次注册若干消息监听器.
           属性解释:
            1.   destination-type - 目的地类型, queue代表消息队列
                  可选值: queue | topic | durableTopic
                  queue - 默认值. 代表消息队列
                  topic - 代表消息队列集合
                  durableTopic - 持久化的消息队列集合. ActiveMQ会保证消息的消费者一定接收到此消息.
            2.   container-type - 容器类型
                  可选值: default | simple
                  default - 默认值. 默认容器类型, 对应DefaultMessageListenerContainer
                  simple - 简单容器类型, 对应SimpleMessageListenerContainer
            3.   connection-factory - 链接工厂, 注入的是Spring-JMS组件提供的链接工厂对象.
               acknowledge - 确认方式
                 | transacted
                  auto - 默  可选值: auto | client | dups-ok认值, 即自动确认消息
                  client - 客户端确认消息
                  dups-ok - 可使用副本的客户端确认消息
                  transacted - 有事务的持久化消息确认机制. 需开启对ActiveMQ的事务控制才可应用.
         -->
           1 . 声明在队列中取消息
        <jms:listener-container destination-type="queue"
           container-type="default" connection-factory="connectionFactory"
           acknowledge="auto">
           <!-- 注册消息监听器. 如果需要注册多个, 重复定义下述标签. -->
                                     (需要监听的目的地)
           <jms:listener destination="test-spring" ref="orderReciver" />
        </jms:listener-container>
       
        <!-- 容器管理消息监听器实现类对象 -->
        <bean id="orderReciver" class="cn.gzsxt.jms.consumer.OrderReciever"/>
     
        <!-- 消息消费者 end -->
    </beans> 
     
     
    七 、 配置SpringMVC
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans   
     
        <context:component-scan base-package="cn.gzsxt.controller" />
        <mvc:annotation-driven />
       
    </beans>
     
     
     
    八 、 配置web.xml
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans   
     
        <context:component-scan base-package="cn.gzsxt.controller" />
        <mvc:annotation-driven />
       
    </beans>
     
    九 、 jsp页面
     
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans   
     
        <context:component-scan base-package="cn.gzsxt.controller" />
        <mvc:annotation-driven />
       
    </beans>
  • 相关阅读:
    (算法)堆与堆排序
    (笔试题)N!的三进制数尾部0的个数
    (笔试题)N!尾部连续0的个数
    程序员与编程一些鲜为人知的事实 软件遵循熵的定律
    关注职业发展,也要关注健康 别让老板杀了你
    其实,最好的年龄才刚刚开始
    你为什么就做不到呢? 正确的选择改变命运
    睡觉前为啥总是忍不住刷网页刷手机?
    中年程序员职业生涯另一选择:创业追寻自己的热情所在
    都很好的两人为何却没有好的婚姻 清楚对方的需要
  • 原文地址:https://www.cnblogs.com/aknife/p/11331710.html
Copyright © 2011-2022 走看看