activeMQ整合Spring

1             Spring整合ActiveMQ

1.1          必要性

Spring已經整合了jms規範了(spring-jms.jar),而ActiveMQ是實現了jms規範的。這就意味着Spring整合ActiveMQ是很是方便的。html

而且Spring-jms,提供了一個JmsTemplate類,用來簡化消息讀寫的業務代碼。Spring整合ActivMQ以後,就能夠使用該類,簡化開發!!!java

 

1.2          需求

使用Spring整合ActiveMQ,模擬限時搶購下的流量削峯問題。web

 

1.3          配置步驟說明

(1)搭建環境。(建立項目,導入jar包)spring

(2)spring整合SpringMVC。apache

(3)spring整合ActiveMQapi

 

1.4          配置步驟

1.4.1         第一部分:建立項目(使用maven)

1.4.1.1     第一步:使用maven建立項目

--注意:maven建立web項目時,默認建立web.xml文件。spring-mvc

 

在/WEB-INF/目錄下,手動建立一個web.xml文件。緩存

 

 

1.4.1.2     第二步:導入pom依賴

導包說明:tomcat

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

 

    <!-- 一、配置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>

 

    <!-- 二、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>

   

    <!-- 三、spring整合消息操做對象JmsTemplate

       使用jmsTemplate能夠簡化代碼,不須要本身去建立消息的發送對象。

    -->

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

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

    </bean>

 

   

    <!-- 四、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";

    }

}

相關文章
相關標籤/搜索