您的位置:首页 > 编程语言 > Java开发

Spring 整合 ActiveMQ

2017-02-17 22:44 381 查看
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;

@Controller
public 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/ 即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息