JMS-ActiveMq与Spring结合转载

原创
小哥 3年前 (2022-11-11) 阅读数 93 #大杂烩

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 版权声明:本文为博主原创文章。转载请附上博客链接!
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除