Spring 整合 ActiveMQ

来源:互联网 发布:ubuntu麒麟 编辑:程序博客网 时间:2024/05/02 02:07

Spring 是J2EE 最重要的框架,ActiveMQ 是Jms的框架,用于两个程序、系统中的异步通信,两者的用途都挺广泛。上一篇博文介绍的是发布-订阅形式,今次以点-点形式做一个案例。先看看效果:

这里写图片描述

这里写图片描述

环境准备:linux + jdk1.7 + myeclipse2014 + maven + tomcat8+ ActiveMQ-5.11.1 + Spring-4.1.6

源码在github上:https://github.com/fuckyourdick/myRegisterSystem/tree/master/SpringJms

项目结构:

这里写图片描述

1).pom.xml

<?xml version="1.0" encoding="UTF-8"?><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.msayem</groupId>    <artifactId>spring-jms-with-activemq</artifactId>    <name>Spring JMS with ActiveMQ</name>    <version>0.0.1-SNAPSHOT</version>    <packaging>war</packaging>    <properties>        <org.springframework-version>4.1.6.RELEASE</org.springframework-version>        <org.apache.activemq-version>5.11.1</org.apache.activemq-version>        <log4j-version>1.2.17</log4j-version>        <org.slf4j-version>1.7.12</org.slf4j-version>        <junit-version>3.8.1</junit-version>        <org.mockito-version>1.10.19</org.mockito-version>        <servlet-api-version>3.1.0</servlet-api-version>    </properties>    <dependencies>        <!-- Spring -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>${org.springframework-version}</version>        </dependency>        <!-- Spring JMS and ActiveMQ -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jms</artifactId>            <version>${org.springframework-version}</version>        </dependency>        <dependency>            <groupId>org.apache.activemq</groupId>            <artifactId>activemq-all</artifactId>            <version>${org.apache.activemq-version}</version>            <scope>compile</scope>        </dependency>        <!-- Logging -->        <dependency>            <groupId>log4j</groupId>            <artifactId>log4j</artifactId>            <version>${log4j-version}</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>            <version>${org.slf4j-version}</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-log4j12</artifactId>            <version>${org.slf4j-version}</version>        </dependency>        <!-- Testing -->        <dependency>           <groupId>junit</groupId>           <artifactId>junit</artifactId>           <version>${junit-version}</version>           <scope>test</scope>      </dependency>      <dependency>              <groupId>javax.servlet</groupId>              <artifactId>javax.servlet-api</artifactId>              <version>${servlet-api-version}</version>          </dependency>            <dependency>            <groupId>org.mockito</groupId>            <artifactId>mockito-core</artifactId>            <version>${org.mockito-version}</version>        </dependency>    </dependencies>    <build>    <finalName>spingAndJmsDemo</finalName>  </build></project>

2).application-context.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: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/jee         http://www.springframework.org/schema/jee/spring-jee-4.1.xsd        http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-4.1.xsd        http://www.springframework.org/schema/context         http://www.springframework.org/schema/context/spring-context-4.1.xsd">    <!-- 扫描注解 -->    <context:component-scan base-package="com.hsp">        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />    </context:component-scan>     <!-- 开启注解 -->    <context:annotation-config/>    <!-- 创建连接工厂 -->    <bean id="connectionFactory"         class="org.apache.activemq.ActiveMQConnectionFactory">        <property name="brokerURL">            <value>tcp://localhost:61616</value>        </property>    </bean>    <!-- 创建目的的(这里的ActiveMQQueue代表点对点,如果要使用发布/订阅的,    用ActiveMQTopic) -->    <bean id="destination"         class="org.apache.activemq.command.ActiveMQQueue">        <constructor-arg value="amqMessageQueue"/>    </bean>    <!-- 创建消息发布者 -->    <bean id="jmsTemplate"         class="org.springframework.jms.core.JmsTemplate">        <property name="connectionFactory" ref="connectionFactory" />        <property name="defaultDestination" ref="destination" />    </bean>    <!-- 设置监听者监听发布者 -->    <jms:listener-container  connection-factory="connectionFactory">        <!-- method代表监听到发布者发布消息时做出的反应 -->        <jms:listener destination="amqMessageQueue" ref="listener" method="messageReceived" />    </jms:listener-container></beans>

3).spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns="http://www.springframework.org/schema/mvc"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:beans="http://www.springframework.org/schema/beans"    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.xsd        http://www.springframework.org/schema/mvc         http://www.springframework.org/schema/mvc/spring-mvc.xsd">    <mvc:annotation-driven />       <context:component-scan base-package="com.hsp.controller" />    <!-- 定义跳转的文件的前后缀 ,视图模式配置-->      <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <beans:property name="prefix" value="/WEB-INF/" />        <beans:property name="suffix" value=".jsp" />    </beans:bean></beans:beans>

4).web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.1"    xmlns="http://xmlns.jcp.org/xml/ns/javaee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">    <!-- 初始化application-context.xml -->     <context-param>        <param-name>contextConfigLocation</param-name>        <param-value>            classpath:application-context.xml        </param-value>    </context-param>    <!-- spring-mvc 分派器-->    <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:spring-mvc.xml</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>          <servlet-mapping>        <servlet-name>dispatcherServlet</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>    <!-- 编码过滤器 -->      <filter>          <filter-name>encodingFilter</filter-name>          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>          <async-supported>true</async-supported>          <init-param>              <param-name>encoding</param-name>              <param-value>UTF-8</param-value>          </init-param>      </filter>      <filter-mapping>          <filter-name>encodingFilter</filter-name>          <url-pattern>/*</url-pattern>      </filter-mapping>      <!-- Spring监听器 -->    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener></web-app>

5).Talk.java

package com.hsp.domain;public class Talk {    private String said;    public String getSaid() {        return said;    }    public void setSaid(String said) {        this.said = said;    }    public Talk(String said) {        this.said = said;    }}

6).Publisher.java

package com.hsp.jms;import javax.jms.JMSException;import javax.jms.MapMessage;import javax.jms.Message;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.Service;import com.hsp.domain.Talk;@Service("publisher")public class Publisher {    @Autowired    private JmsTemplate jmsTemplate;    //发布    public void sendTalk(String said) {        Talk talk = new Talk(said);        sendMessage(talk);    }    public void sendMessage(final Talk talk) {        //内部类利用jmsTemplate创建session        jmsTemplate.send(            new MessageCreator() {                public Message createMessage(Session session) throws JMSException {                    MapMessage mapMessage = session.createMapMessage();                    mapMessage.setString("said", talk.getSaid());                    return mapMessage;                }            }        );        System.out.println("Publisher: " + talk.getSaid());    }}

7).Listener.java

package com.hsp.jms;import java.util.Map;import org.springframework.jms.annotation.JmsListener;import org.springframework.stereotype.Service;@Service("listener")public class Listener {    //监听    @JmsListener(destination="amqMessageQueue")    public void messageReceived(Map<String, Object> message) throws Exception {        String said = (String) message.get("said");        System.out.println( "Listener: " + said);    }}

8).ChattingAction.java

package com.hsp.controller;import javax.servlet.http.HttpServletRequest;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.hsp.jms.Listener;import com.hsp.jms.Publisher;@Controllerpublic class ChattingAction{    @RequestMapping(value = "/publish", method = RequestMethod.POST)    public String jmsMessagePublish(HttpServletRequest request) {        //从sring容器中取出publisher,执行发布的动作        ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");        Publisher publisher = (Publisher) context.getBean("publisher");        String said = request.getParameter("said");        publisher.sendTalk(said);        //关闭ApplicationContext        ((ClassPathXmlApplicationContext)context).close();        return "redirect:/";    }}

9).chat.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">    <title>chat</title>    </head>    <body>         <div>            <form action="/SpringJms/publish" method="post">                <input type="text" name="said"/>                <input type='submit' value='publish'/>                 </form>         </div>    </body></html>

10).index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">    <title>index</title>    </head>    <body>      <jsp:forward page="/WEB-INF/chat.jsp"></jsp:forward>    </body></html>

11).在浏览器访问:http://localhost:8080/SpringJms/ 即可。

0 0
原创粉丝点击