JMS-ActiveMq与Spring整合:这里的代码可以直接使用。
工具:
IDEA,
jdk1.8,
Activemq5.14
Tomcat8
Gradle
项目的配置
首先得是Gradle配置(此处采用Gradle依赖管理):
"org.springframework:spring-jms:4.2.4.RELEASE",
"org.apache.activemq:activemq-all:5.14.2",
"org.springframework:spring-web:4.1.4.RELEASE",
"org.springframework:spring-core:4.1.4.RELEASE",
"org.springframework:spring-webmvc:4.1.4.RELEASE",
"org.springframework:spring-tx:4.1.4.RELEASE",
配置ConnectionFactory
connectionFactory是Spring用于创建。JMS服务器链接,Spring提供多种connectionFactory,我们介绍两个SingleConnectionFactory和CachingConnectionFactory。
SingleConnectionFactory:用于建立JMS对服务器链接请求将始终返回相同的链接。
并将忽略Connection的close方法调用。
CachingConnectionFactory:继承了SingleConnectionFactory,所以它有SingleConnectionFactory在所有功能中,它还添加了一个缓存功能,可以缓存Session、MessageProducer和MessageConsumer。我们使用CachingConnectionFactory举个例子。
Spring提供的ConnectionFactory只是Spring用于管理ConnectionFactory真的生产JMS服务器链接ConnectionFactory还得是由JMS服务供应商提供并需要将其注入Spring提供的ConnectionFactory在里面我们在这里使用ActiveMQ实现的JMS,所以我们真的可以生产Connection应该是ActiveMQ提供的ConnectionFactory。因此,定义ConnectionFactory完整的代码应如下所示:
配置生产者
配置好ConnectionFactory然后我们需要分配生产者。制作人负责生成和发送消息JMS服务器但是我们如何发送信息呢?通常使用Spring对于我们的JmsTemplate类来实现,因此配置生产者实际上是发送的配置消息的核心。JmsTemplate。对于消息的发送者来说,在发送消息时应该知道将消息发送到哪里。为此,我们定义JmsTemplate当您需要注射Spring提供的ConnectionFactory对象。
在利用JmsTemplate发送消息时,我们需要知道要发送哪种消息类型:一种是点对点ActiveMQQueue,另一个是支持订阅/释放模式。ActiveMQTopic如下:
生产者如何指定目的地并发送消息?如果您查看源代码,这里将不再提供它。
配置使用者
生产者到指定目的地Destination发送消息后,下一步是消费者将消息消费到指定的目的地。那么消费者如何知道生产者将消息发送到指定的目的地Destination它在哪里?每个消费者都需要为每个目的地指定相应的目的地。MessageListenerContainer。对于消息侦听容器,除了知道要侦听哪个目的地之外,它还需要知道在哪里侦听,也就是说,它还必须知道要侦听哪一个目的地。JMS服务器,通过配置MessageListenerContainer当注入一个ConnectionFactory实现。因此,我们正在配置MessageListenerContainer必须指定三个属性:一个是侦听位置。ConnectionFactory; 一种是表示倾听或其他Destination; 一种是在收到消息后进行处理。MessageListener。
此时,Spring和JMS,ActiveMQ整合的spring-activemq.xml已完成,下面显示了所有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:amq="http://activemq.apache.org/schema/core"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd">
spring-core.xml配置:
spring-mvc.xml配置:
web.xml配置:
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:spring-mvc.xml
1
dispatcher
/
org.springframework.web.context.ContextLoaderListener
10
contextConfigLocation
classpath*:spring-core.xml
index.jsp
生产者代码QueueSender.java:
package com.lei.activemq.springmq.producer.queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
/**
* Created by leitao on 2017/3/2.
*/
@Component("queueSender")
public class QueueSender {
@Autowired
@Qualifier("jmsQueueTemplate")
private JmsTemplate jmsTemplate;//通过@Qualifier要注入相应bean
/**
* 向指定队列(目标)发送消息
* @param queueName 队列名称
* @param message 消息内容
*/
public void send(String queueName,final String message){
jmsTemplate.send(queueName, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
}
生产者TopicSender.java:
package com.lei.activemq.springmq.producer.topic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
/**
* Created by leitao on 2017/3/2.
*/
@Component("topicSender")
public class TopicSender {
@Autowired
@Qualifier("jmsTopicTemplate")
private JmsTemplate jmsTemplate;
/**
* 向指定队列(目标)发送消息
* @param topicName 队列名称
* @param message 消息内容
*/
public void send(String topicName,final String message){
jmsTemplate.send(topicName, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
}
消费者代码如下:
package com.lei.activemq.springmq.comsumer.queue;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* Created by leitao on 2017/3/2.
*/
@Component
public class QueueReceiver1 implements MessageListener {
@Override
public void onMessage(Message message) {
try {
System.out.println("QueueReceiver1收到的消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
package com.lei.activemq.springmq.comsumer.queue;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* Created by leitao on 2017/3/2.
*/
@Component
public class QueueReceiver2 implements MessageListener{
@Override
public void onMessage(Message message) {
try {
System.out.println("QueueReceiver2收到的消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
package com.lei.activemq.springmq.comsumer.topic;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* Created by leitao on 2017/3/2.
*/
@Component
public class TopicReceiver1 implements MessageListener {
@Override
public void onMessage(Message message) {
try {
System.out.println("TopicReceiver1收到的消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
package com.lei.activemq.springmq.comsumer.topic;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* Created by leitao on 2017/3/2.
*/
@Component
public class TopicReceiver2 implements MessageListener{
@Override
public void onMessage(Message message) {
try {
System.out.println("TopicReceiver2收到的消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
测试Controller:
package com.lei.activemq.springmq;
import com.lei.activemq.springmq.producer.queue.QueueSender;
import com.lei.activemq.springmq.producer.topic.TopicSender;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
/**
* Created by leitao on 2017/3/2.
*/
@Controller
@RequestMapping(value = "activemq")
public class ActivemqController {
@Resource
QueueSender queueSender;
@Resource
TopicSender topicSender;
/**
* 将消息发送到队列
* Queue队列:只有一个订阅者会收到消息,一旦消息被处理,它将不存在于队列中。
* @param message
* @return String
*/
@ResponseBody
@RequestMapping(value = "/queueSender")
public String queueSender(@RequestParam("message")String message){
String opt="";
try {
queueSender.send("test.queue", message);
opt = "suc";
} catch (Exception e) {
opt = e.getCause().toString();
}
return opt;
}
/**
* 向主题发送消息
* Topic主题 :输入一条消息,所有订户都会收到。
* 这是主题目的地是一对多
* @param message
* @return String
*/
@ResponseBody
@RequestMapping(value = "/topicSender")
public String topicSender(@RequestParam("message")String message){
String opt = "";
try {
topicSender.send("test.topic", message);
opt = "suc";
} catch (Exception e) {
opt = e.getCause().toString();
}
return opt;
}
}
源码下载:http://download.csdn.net/detail/admin1973/9768550
参考资料:
http://blog.csdn.net/jiuqiyuliang/article/details/48758203
---------------------
作者:陶涛
来源:CSDN
原文:https://blog.csdn.net/admin1973/article/details/59540386
版权声明:本文为博主原创文章。转载请附上博客链接!
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除