activeMQ整合Spring

1             Spring整合ActiveMQ

1.1          必要性

Spring已经整合了jms规范了(spring-jms.jar),而ActiveMQ是实现了jms规范的。这就意味着Spring整合ActiveMQ是非常方便的。

并且Spring-jms,提供了一个JmsTemplate类,用来简化消息读写的业务代码。Spring整合ActivMQ之后,就可以使用该类,简化开发!!!

 

1.2          需求

使用Spring整合ActiveMQ,模拟限时抢购下的流量削峰问题。

 

1.3          配置步骤说明

(1)搭建环境。(创建项目,导入jar包)

(2)spring整合SpringMVC。

(3)spring整合ActiveMQ

 

1.4          配置步骤

1.4.1         第一部分:创建项目(使用maven)

1.4.1.1     第一步:使用maven创建项目

--注意:maven创建web项目时,默认创建web.xml文件。

 

在/WEB-INF/目录下,手动创建一个web.xml文件。

 

 

1.4.1.2     第二步:导入pom依赖

导包说明:

     Spring核心包+AOP

     common-logging

     activemq核心包

     spring整合jms包 

     jsp相关依赖

      

<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>cn.gzsxt.activemq</groupId>

  <artifactId>activemq-demo-02-spring</artifactId>

  <version>1.0</version>

  <packaging>war</packaging>

 

  <dependencies>

       <!-- ActiveMQ客户端完整jar包依赖 -->

       <dependency>

           <groupId>org.apache.activemq</groupId>

           <artifactId>activemq-all</artifactId>

           <version>5.9.0</version>

       </dependency>

      

       <dependency>

           <groupId>org.apache.activemq</groupId>

           <artifactId>activemq-pool</artifactId>

           <version>5.9.0</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>

<!-- jsp相关 -->

       <dependency>

           <groupId>jstl</groupId>

           <artifactId>jstl</artifactId>

           <version>1.2</version>

       </dependency>

       <dependency>

           <groupId>javax.servlet</groupId>

           <artifactId>servlet-api</artifactId>

           <version>2.5</version>

           <scope>provided</scope>

       </dependency>

       <dependency>

           <groupId>javax.servlet</groupId>

           <artifactId>jsp-api</artifactId>

           <version>2.0</version>

           <scope>provided</scope>

       </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>

</project>

 

1.4.2         第二部分:spring整合springmvc

1.4.2.1     第一步:修改web.xml,配置springmvc核心控制器

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_2_5.xsd ">

<!-- 编码过滤器 -->

  <filter>

       <filter-name>characterEncodingFilter</filter-name>

       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

       <init-param>

           <param-name>encoding</param-name>

           <param-value>utf-8</param-value>

       </init-param>

  </filter>

  <filter-mapping>

       <filter-name>characterEncodingFilter</filter-name>

       <url-pattern>/*</url-pattern>

  </filter-mapping>

 

  <!-- 配置springmvc核心控制器 -->

  <servlet>

       <servlet-name>dispatcherServlet</servlet-name>

       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

      

       <init-param>

           <param-name>contextConfigLocation</param-name>

           <param-value>classpath:springmvc.xml</param-value>

       </init-param>

      

       <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>

       <servlet-name>dispatcherServlet</servlet-name>

       <url-pattern>*.action</url-pattern>

  </servlet-mapping>

 

</web-app>

 

1.4.2.2     第二步:配置springmvc.xml核心配置文件

<?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:context="http://www.springframework.org/schema/context"

    xmlns:mvc="http://www.springframework.org/schema/mvc"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd

       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">

 

    <context:component-scan base-package="cn.gzsxt.controller" />

    <mvc:annotation-driven />

 

</beans>

 

1.4.2.3     第三步:创建相关jsp页面

--订单页面order.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

    <form action="/save.action" method="post">

           用户编号:<input type="text" name="userid"><br>

           订单金额:<input type="text" name="price"><br>

           <input type="submit" value="提交">

    </form>

</body>

</html>

 

--成功页面success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

    订单提交成功!!!请稍后去结算中心支付。。。

</body>

</html>

 

1.4.2.4     第四步:java代码实现

--创建订单Order类

package cn.gzsxt.jms.pojo;

 

public class Order {

 

    private Integer id;

   

    private Integer userid;

   

    private float price;

 

    public Order() {

       super();

    }

 

    public Integer getId() {

       return id;

    }

 

    public void setId(Integer id) {

       this.id = id;

    }

 

    public Integer getUserid() {

       return userid;

    }

 

    public void setUserid(Integer userid) {

       this.userid = userid;

    }

 

    public float getPrice() {

       return price;

    }

 

    public void setPrice(float price) {

       this.price = price;

    }

   

}

 

--创建OrderController类

package cn.gzsxt.jms.controller;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

 

import cn.gzsxt.jms.pojo.Order;

 

@Controller

public class OrderController {

 

    @RequestMapping("/save.action")

    public String save(Order order){

      

       System.out.println("当前提交的订单用户是:"+order.getUserid()+",订单金额:"+order.getPrice());

      

       return "/success.jsp";

    }

}

 

1.4.2.5     第五步:整合测试

--以tomcat插件启动项目,访问订单业务,提交订单

 

 

--整合springmvc成功!!!

 

1.4.3         第三部分:Spring整合ActiveMQ

整合步骤说明:

(1)搭建ActiveMQ服务器。(已实现)

(2)创建消息生产者

(3)创建消息消费者

(4)spring整合activemq

 

1.4.3.1     第一步:搭建ActiveMQ服务器。(已实现)

 

1.4.3.2     第二步:创建消息生成者OrderProducer

--说明:在这里,我们注入JmsTemplate类,来简化代码

package cn.gzsxt.jms.producer;

 

import javax.jms.JMSException;

import javax.jms.Message;

import javax.jms.ObjectMessage;

import javax.jms.Session;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jms.core.JmsTemplate;

import org.springframework.jms.core.MessageCreator;

import org.springframework.stereotype.Component;

 

import cn.gzsxt.jms.pojo.Order;

 

@Component

public class OrderProducer {

 

    @Autowired

    private JmsTemplate jmsTemplate;

   

    //注意:内部类调用外部类属性,需要用final修饰

    public void sendToMQ(final Order order){

       //指定队列名称 order-mq

       jmsTemplate.send("order-mq", new MessageCreator() {

          

           @Override

           public Message createMessage(Session session) throws JMSException {

              //ActiveMQ处理对象消息时,对象需要实现序列化

              Message message = session.createObjectMessage(order);

             

              return message;

           }

       });

    }  

}

 

--注意事项

(1)ActiveMQ处理对象时,对象必须实现序列化

 

--修改Order类,实现序列化接口

 

 

(2)匿名内部类访问外部类属性,该属性需要用final修饰。

 

1.4.3.3     第三步:创建消息消费者OrderListener类

--这里使用监听器模式

package cn.gzsxt.jms.listener;

 

import javax.jms.JMSException;

import javax.jms.Message;

import javax.jms.MessageListener;

import javax.jms.ObjectMessage;

 

import org.springframework.stereotype.Component;

 

import cn.gzsxt.jms.pojo.Order;

 

@Component

public class OrderListener implements MessageListener{

 

    @Override

    public void onMessage(Message message) {

      

       if(null!=message){

           ObjectMessage oMsg = (ObjectMessage) message;

          

           try {

              Order order = (Order) oMsg.getObject();

              System.out.println("当前提交的订单用户是:"+order.getUserid()+",订单金额:"+order.getPrice());

              /*

               * 伪代码:

               *

               * orderDao.save(order);

               */

           } catch (JMSException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

    }

}

 

1.4.3.4     第四步:spring整合ActiveMQ

--创建spring-jms.xml文件

<?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:jms="http://www.springframework.org/schema/jms"

    xsi:schemaLocation="http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.1.xsd

       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

 

    <!-- 1、配置activemq连接工程

       使用连接池好处:链接只需要初始化一次,每次要使用的时候,直接从连接池获取,用完之后还给连接池。省去了每次创建、销毁连接的时间。                                  

    -->

    <bean name="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">

       <property name="connectionFactory">

           <bean class="org.apache.activemq.ActiveMQConnectionFactory">

              <property name="brokerURL" value="tcp://192.168.23.12:61616"/>

              <property name="userName" value="admin"/>

              <property name="password" value="admin"/>

           </bean>

       </property>

       <property name="maxConnections" value="20"></property>

    </bean>

 

    <!-- 2、spring整合activemq链接工厂

        可以缓存session。

    -->

    <bean name="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">

        <property name="targetConnectionFactory" ref="pooledConnectionFactory"></property>

       <property name="sessionCacheSize" value="5"></property>

    </bean>

   

    <!-- 3、spring整合消息操作对象JmsTemplate

       使用jmsTemplate可以简化代码,不需要自己去创建消息的发送对象。

    -->

    <bean name="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">

       <property name="connectionFactory" ref="cachingConnectionFactory"></property>

    </bean>

 

   

    <!-- 4、spring加载监听器

       acknowledge="auto"  表示消息获取之后,自动出队列

       container-type    表示的容器的类型   default|simple

           default:支持session缓存。

    -->

    <jms:listener-container acknowledge="auto"

       container-type="default"

       destination-type="queue"

       connection-factory="cachingConnectionFactory">

       <!-- 指定监听器

           destination="order-mq"  指定监听的是哪一个队列

           ref="orderListener"         指定监听器对象  使用注解的时候,对象的名称是类名首字母小写

        -->

       <jms:listener destination="order-mq" ref="orderListener"/>

    </jms:listener-container>

 

</beans>

 

1.4.3.5     第五步:修改web.xml文件,加载jms配置

<!-- 配置springmvc核心控制器 -->

  <servlet>

       <servlet-name>dispatcherServlet</servlet-name>

       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

      

       <init-param>

           <param-name>contextConfigLocation</param-name>

           <!-- <param-value>classpath:springmvc.xml</param-value> -->

           <param-value>classpath:spring*.xml</param-value>

       </init-param>

      

       <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>

       <servlet-name>dispatcherServlet</servlet-name>

       <url-pattern>*.action</url-pattern>

  </servlet-mapping>

 

1.5          整合测试

1.5.1         第一步:修改OrderController类

--注入OrderProducer,修改业务逻辑

@Controller

public class OrderController {

    @Autowired

    private OrderProducer producer;

   

    @RequestMapping("/save.action")

    public String save(Order order){

      

//     System.out.println("当前提交的订单用户是:"+order.getUserid()+",订单金额:"+order.getPrice());

      

       producer.sendToMQ(order);

      

       return "/success.jsp";

    }

}

posted @ 2019-07-30 19:30  于陆  阅读(322)  评论(0编辑  收藏  举报