一、pom.xml中添加相关依赖
<dependency>
<groupId>org.apache.activemqgroupId>
<artifactId>activemq-coreartifactId>
<version>5.7.0version>
dependency>
<dependency>
<groupId>org.apache.activemqgroupId>
<artifactId>activemq-poolartifactId>
<version>5.12.1version>
dependency>
二、加入activemq.xml配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:jms="http://www.springframework.org/schema/jms"
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-4.1.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
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd"
>
<context:component-scan base-package="service" />
<mvc:annotation-driven />
<amq:connectionFactory id="amqConnectionFactory"
brokerURL="tcp://127.0.0.1:61616"
userName="admin"
password="admin" />
<bean id="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory" />
<property name="sessionCacheSize" value="100" />
bean>
<bean id="demoQueueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="MQ-FTP,MQ-Analysis,MQ-AnalysisResult,MQ-ImageBack" />
bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultDestination" ref="demoQueueDestination" />
<property name="receiveTimeout" value="10000" />
<property name="pubSubDomain" value="false" />
bean>
<bean id="queueMessageListener" class="MQ.QueueMessageListener" />
<bean id="queueListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="demoQueueDestination" />
<property name="messageListener" ref="queueMessageListener" />
bean>
beans>
三、web.xml里边配置activemq.xml的路径
param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:activemq.xmlparam-value>
param>
四、添加消息生产者Service
package service;
import model.User;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import java.io.Serializable;
@Service
public class ProducerService {
@Resource(name="jmsTemplate")
private JmsTemplate jmsTemplate;
/**
* 向指定队列发送消息
*/
public void sendMessage(Destination destination, final String msg) {
System.out.println("向队列" + destination.toString() + "发送了消息------------" + msg);
jmsTemplate.send(destination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(msg);
}
});
}
/**
* 向默认队列发送消息
*/
public void sendMessage(final String msg) {
String destination = jmsTemplate.getDefaultDestination().toString();
System.out.println("向队列" +destination+ "发送了消息------------" + msg);
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(msg);
}
});
}
/**
* 向指定Destination发送序列化的对象
*
* @param destination
* @param object
* object 必须序列化
*/
public void sendObjectMessage(Destination destination, final Serializable object) {
if (null == destination) {
destination = jmsTemplate.getDefaultDestination();
}
jmsTemplate.send(destination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createObjectMessage(object);
}
});
System.out.println("springJMS send object message...");
}
}
五、加入消息监听器自动消费消息
package MQ;
import ftpManage.FtpEntity;
import ftpManage.FtpUtil;
import model.TvdsImage;
import model.TvdsResult;
import org.apache.activemq.command.ActiveMQDestination;
import org.springframework.beans.factory.annotation.Autowired;
import service.ProducerService;
import service.TvdsImageService;
import service.TvdsResultService;
import javax.annotation.Resource;
import javax.jms.*;
/**
* 当收到消息自动调用onMessage方法
* 一旦有新消息,将自动读取消费
* 监听器检测到消息,将立即消费掉
*/
public class QueueMessageListener implements MessageListener {
//队列消息生产者
@Resource(name="producerService")
private ProducerService producerService;
@Autowired
private TvdsResultService tvdsResultService;
@Autowired
private TvdsImageService tvdsImageService;
//当收到消息后,自动调用该方法
public void onMessage(Message message) {
// TextMessage tm = (TextMessage) message;
// try {
// System.out.println("QueueMessageListener监听到了文本消息:\t" + tm.getText());
// //do something ...
// } catch (JMSException e) {
// e.printStackTrace();
// }
//测试发送多个队列的
try {
ActiveMQDestination activeMQDestination=(ActiveMQDestination)message.getJMSDestination();
/**
* 监听消息队列queue1中的消息
* ftp下载0
*/
if(activeMQDestination.getPhysicalName().equalsIgnoreCase("MQ-FTP"))
{
System.out.println("监听队列:"+activeMQDestination.getPhysicalName()+"消费了消息:");
// 如果是文本消息
if (message instanceof TextMessage) {
TextMessage _tm = (TextMessage) message;
try {
System.out.println("from get textMessage:\t" + _tm.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
// 如果是Object消息
if (message instanceof ObjectMessage) {
ObjectMessage objMsg = (ObjectMessage) message;
try {
FtpEntity ftp=(FtpEntity) objMsg.getObject();
System.out.println("addrIp:"+ftp.getIpAddr()+" port:"+ftp.getPort()+"用户名:"+ftp.getUserName()+"密码:"+ftp.getPwd());
//开始ftp 下载
FtpUtil ftpUtil = new FtpUtil();
ftpUtil.startDown(ftp,ftp.getLocalPath(),ftp.getRemotePath());
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 监听消息队列queue2中的消息
* 视频分析
*/
if(activeMQDestination.getPhysicalName().equalsIgnoreCase("MQ-Analysis"))
{
System.out.println("监听队列:"+activeMQDestination.getPhysicalName()+"消费了消息:");
// 如果是文本消息
if (message instanceof TextMessage) {
TextMessage __tm = (TextMessage) message;
try {
System.out.println("from get textMessage:\t" + __tm.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
// 如果是Object消息
if (message instanceof ObjectMessage) {
ObjectMessage objMsg = (ObjectMessage) message;
try {
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 监听消息队列queue3
* 识别结果队列
*/
if(activeMQDestination.getPhysicalName().equalsIgnoreCase("MQ-AnalysisResult"))
{
System.out.println("监听队列:"+activeMQDestination.getPhysicalName()+"消费了消息:");
// 如果是文本消息
if (message instanceof TextMessage) {
TextMessage __tm = (TextMessage) message;
try {
System.out.println("from get textMessage:\t" + __tm.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
// 如果是Object消息
if (message instanceof ObjectMessage) {
ObjectMessage objMsg = (ObjectMessage) message;
try {
TvdsResult tvdsResult = (TvdsResult)objMsg.getObject();
tvdsResultService.insertByEntity(tvdsResult);
System.out.println("往队列"+activeMQDestination.getCompositeDestinations()[2].getPhysicalName()+"中发送对象消息");
producerService.sendObjectMessage(activeMQDestination.getCompositeDestinations()[2], tvdsResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 监听消息队列queue4
* 图片队列
*/
if(activeMQDestination.getPhysicalName().equalsIgnoreCase("MQ-ImageBack"))
{
System.out.println("监听队列:"+activeMQDestination.getPhysicalName()+"消费了消息:");
// 如果是文本消息
if (message instanceof TextMessage) {
TextMessage __tm = (TextMessage) message;
try {
System.out.println("from get textMessage:\t" + __tm.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
// 如果是Object消息
if (message instanceof ObjectMessage) {
ObjectMessage objMsg = (ObjectMessage) message;
try {
TvdsImage tvdsImage = (TvdsImage)objMsg.getObject();
tvdsImageService.insertByEntity(tvdsImage);
System.out.println("往队列"+activeMQDestination.getCompositeDestinations()[3].getPhysicalName()+"中发送对象消息");
producerService.sendObjectMessage(activeMQDestination.getCompositeDestinations()[3], tvdsImage);
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (JMSException e1) {
e1.printStackTrace();
}
}
}
六、处理页面的Controller
(1)欢迎页WelcomeController
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class WelcomeController {
@RequestMapping(value="/welcome",method=RequestMethod.GET)
public ModelAndView welcome(){
System.out.println("------------welcome");
ModelAndView mv = new ModelAndView();
mv.setViewName("welcome");
return mv;
}
}
欢迎页welcome.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2017/12/28 0028
Time: 13:08
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Welcometitle>
head>
<body>
<h1>Welcome!!!h1>
<h2><a href="producer">去发消息a>h2>
<h2><a href="receive">从队列中取一个消息a>h2>
body>
html>
(2)发送消息页面DemoController
package controller;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.TextMessage;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import service.ConsumerService;
import service.ProducerService;
import service.UserService;
@Controller
public class DemoController {
@Autowired
protected UserService userService;
//队列名gzframe.demo
@Resource(name="demoQueueDestination")
private Destination demoQueueDestination;
//队列消息生产者
@Resource(name="producerService")
private ProducerService producer;
//队列消息消费者
@Resource(name="consumerService")
private ConsumerService consumer;
@RequestMapping(value="/producer",method=RequestMethod.GET)
public ModelAndView producer(){
System.out.println("------------go producer");
Date now = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = dateFormat.format( now );
ModelAndView mv = new ModelAndView();
mv.addObject("time", time);
mv.setViewName("jms_producer");
return mv;
}
@RequestMapping(value="/onsend",method=RequestMethod.POST) //发消息
public ModelAndView producer(@RequestParam("message") String message) {
System.out.println("开始发送消息------------send to jms");
ModelAndView mv = new ModelAndView();
producer.sendMessage(demoQueueDestination, message);
mv.setViewName("welcome");
return mv;
}
@RequestMapping(value="/receive",method=RequestMethod.GET)
public ModelAndView queue_receive() throws JMSException {
System.out.println("------------receive message");
ModelAndView mv = new ModelAndView();
TextMessage tm = consumer.receive(demoQueueDestination);
mv.addObject("textMessage", tm.getText());
mv.setViewName("queue_receive");
return mv;
}
/*
* ActiveMQ Manager Test
*/
@RequestMapping(value="/jms",method=RequestMethod.GET)
public ModelAndView jmsManager() throws IOException {
System.out.println("------------jms manager");
ModelAndView mv = new ModelAndView();
mv.setViewName("welcome");
JMXServiceURL url = new JMXServiceURL("");
JMXConnector connector = JMXConnectorFactory.connect(url);
connector.connect();
MBeanServerConnection connection = connector.getMBeanServerConnection();
return mv;
}
}
发送消息页面jms_producer.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2017/12/28 0028
Time: 13:09
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JMS-Producertitle>
head>
<body>
<h1>JMS-Producer!!!h1>
<form action="onsend" method="post">
MessageText:<textarea name="message">${time }textarea>
<input type="submit" value="提交" />
form>
<h2><a href="welcome">返回主页a>h2>
body>
html>