SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解

1.导入jar包:

 <!--jmsTemplate-->
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-activemq</artifactId>
  </dependency>
  <dependency>
   <groupId>org.apache.activemq</groupId>
   <artifactId>activemq-pool</artifactId>
  </dependency>

2.填写配置文件(application.properties)

#设置JMS(AMQ)
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=true
#spring.jms.pub-sub-domain=true
spring.activemq.pool.max-connections=50
spring.activemq.pool.expiry-timeout=10000
spring.activemq.pool.idle-timeout=30000

上面需要注意的是,如果开启订阅者和发布者模式下面的代码会使监听器失效。

3.编写控制器代码

@RestController
@RequestMapping("/Jms")
public class ProducerController {

 @Autowired
 private JmsProducerService jmsProducerService;

 @RequestMapping("/send")
 public void contextLoads() throws InterruptedException {
  Destination destination = new ActiveMQQueue("mytest.queue");
  for(int i=0; i<10; i++){
   jmsProducerService.sendMessage(destination, "我是超人啊");
  }
  System.out.println("发送成功");
 }

}

4.服务层代码:

package com.zzf.finals.service.impl;

import com.zzf.finals.service.JmsProducerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;

import javax.jms.Destination;

@Service
public class JmsProducerServiceImpl implements JmsProducerService {

 @Autowired
 private JmsTemplate jmsTemplate;

 @Override
 public void sendMessage(Destination destination, String message) {
  this.jmsTemplate.convertAndSend(destination,message);
 }
}

5.最后加上监听器类

package com.zzf.finals.domain;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class Consumer {

 @JmsListener(destination = "mytest.queue")
 public void receiveQueue(String text) {
  System.out.println("Message:"+text);
 }
}

OK~

但是这样有另外一个问题:如果开启了订阅者和发布者模式则无法发送和接收queue消息。

这里我提供两种写法xml和java配置:

首先贴上我的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"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd">

 <!--连接池,内部引入一个连接工厂-->
 <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
   destroy-method="stop">
  <property name="connectionFactory">
   <bean class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL">
     <value>tcp://localhost:61616</value>
    </property>
   </bean>
  </property>
  <property name="maxConnections" value="100"></property>
 </bean>

 <bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
  <constructor-arg name="name" value="spring-queue"/>
 </bean>

 <!--测试Topic-->
 <bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
  <constructor-arg name="name" value="spring-topic"/>
 </bean>

 <!--配置消息容器-->
 <bean id="TopicContainers" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory">
  <property name="pubSubDomain" value="true"/>
  <property name="connectionFactory" ref="jmsFactory"/>
 </bean>

 <!--配置队列消息容器-->
 <bean id="QueueContainers" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory">
  <property name="connectionFactory" ref="jmsFactory"/>
 </bean>

</beans>

JavaConfig配置为:

package com.zzf.finals.domain;

import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;

import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Topic;

@Configuration
public class JmsConfig {
 public final static String TOPIC = "topic.test";
 public final static String QUEUE = "queue.test";
 @Bean
 public Queue queue() {
  return new ActiveMQQueue(QUEUE);
 }

 @Bean
 public Topic topic() {
  return new ActiveMQTopic(TOPIC);
 }

 // topic模式的ListenerContainer
 @Bean
 public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {
  DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
  bean.setPubSubDomain(true);
  bean.setConnectionFactory(activeMQConnectionFactory);
  return bean;
 }
 // queue模式的ListenerContainer
 @Bean
 public JmsListenerContainerFactory<?> jmsListenerContainerQueue(ConnectionFactory activeMQConnectionFactory) {
  DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
  bean.setConnectionFactory(activeMQConnectionFactory);
  return bean;
 }

}

控制台代码为:

package com.zzf.finals.controller;

import com.zzf.finals.service.JmsProducerService;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.jms.Destination;
import javax.jms.Queue;
import javax.jms.Topic;

@RestController
@RequestMapping("/Jms")
public class ProducerController {

 @Autowired
 private JmsProducerService jmsProducerService;
 @Autowired
 private Topic topic;
 @Autowired
 private Queue queue;

 @Autowired
 private Topic destinationTopic;
 @Autowired
 private Queue destinationQueue;

 @RequestMapping("/send3")
 public void testJms2() {
  for (int i=0;i<10;i++) {
   jmsProducerService.sendMessage(destinationQueue,"queue,world!" + i);
   jmsProducerService.sendMessage(destinationTopic, "topic,world!" + i);
  }
 }

 @RequestMapping("/send2")
 public void testJms() {
  for (int i=0;i<10;i++) {
   jmsProducerService.sendMessage(queue,"queue,world!" + i);
   jmsProducerService.sendMessage(topic, "topic,world!" + i);
  }
 }

  @RequestMapping("/send")
 public void contextLoads() throws InterruptedException {
  Destination destination = new ActiveMQQueue("mytest.queue");
  for(int i=0; i<10; i++){
   jmsProducerService.sendMessage(destination, "我是超人啊");
  }
  System.out.println("发送成功");
 }
}

最后的监听器类:

package com.zzf.finals.domain;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class Consumer {

 @JmsListener(destination = "mytest.queue")
 public void receiveQueue(String text) {
  System.out.println("Message:"+text);
 }

 @JmsListener(destination = JmsConfig.TOPIC,containerFactory = "jmsListenerContainerTopic")
 public void onTopicMessage(String msg) {
  System.out.println("topic:"+msg);
 }

 @JmsListener(destination = JmsConfig.QUEUE,containerFactory = "jmsListenerContainerQueue")
 public void onQueueMessage(String msg) {
  System.out.println("queue:"+msg);
 }

 @JmsListener(destination = "spring-topic",containerFactory = "TopicContainers")
 public void onTopicMessageXML(String msg) {
  System.out.println("topic1:"+msg);
 }
 @JmsListener(destination = "spring-topic",containerFactory = "TopicContainers")
 public void onTopicMessageXML2(String msg) {
  System.out.println("topic2:"+msg);
 }

 @JmsListener(destination = "spring-queue",containerFactory = "QueueContainers")
 public void onQueueMessageXML(String msg) {
  System.out.println("queue:"+msg);
 }
}

OK~JmsTemplate的使用和配置Demo就完成了 ,有兴趣的可以自己跑下试试

总结

到此这篇关于SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解的文章就介绍到这了,更多相关SpringBoot集成JmsTemplate内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot 整合 JMSTemplate的示例代码

    1.1 添加依赖   可以手动在 SpringBoot 项目添加依赖,也可以在项目创建时选择使用 ActiveMQ 5 自动添加依赖.高版本 SpringBoot (2.0 以上) 在添加 activemq 连接池依赖启动时会报 Error creating bean with name 'xxx': Unsatisfied dependency expressed through field 'jmsTemplate'; 可以将 activemq 连接池换成 jms 连接池解决. <depen

  • Spring实战之XML与JavaConfig的混合配置详解

    前言 之前提到了关于Spring的显示配置方式有两种,一种是基于XML配置,一种是基于JavaConfig的方式配置.对于这两种配置方式并不是互斥关系,相反,他们两能够相互融合,有效的搭配完成Spring的bean注入. 这里分别介绍如何在JavaConfig中引用XML配置的bean以及如何在XML配置中引用JavaConfig.下面话不多说,来一起看看详细的介绍吧. 一.JavaConfig中引用XML配置的bean 上篇我们看到配置类CDPlayerConfig具体代码如下 @Config

  • SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解

    1.导入jar包: <!--jmsTemplate--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.apache.activemq</g

  • 详解SpringBoot集成消息队列的案例应用

    目录 背景 方案规划 统一设计 集成Redis消息队列 集成ActiveMQ消息队列 使用示例 背景 最近在对公司开发框架进行优化,框架内涉及到多处入库的日志记录,例如登录日志/操作日志/访问日志/业务执行日志,集成在业务代码中耦合度较高且占用业务操作执行时间,所以准备集成相关消息队列进行代码解耦 方案规划 现有的成熟消息队列组件非常多,例如RabbitMQ,ActiveMQ,Kafka等,考虑到业务并发量不高且框架已经应用于多个项目平稳运行,准备提供基于Redis的消息队列和集成ActiveM

  • SpringBoot集成mqtt的多模块项目配置详解

    前言 近期为了准备毕设,准备使用SpringBoot搭建mqtt后端,本篇主要记录了在IDEA中搭建SpringBoot mqtt的多模块项目的过程 开发工具及系统环境 IDE:IntelliJ IDEA 2020.2 操作系统:Windows 10 2004 Java Version:1.8 SpringBoot Version:2.1.17.RELEASE 项目路径 Study |----study-common # 存放公共类 |----study-mapper # mapper层 |--

  • spark之Standalone模式部署配置详解

    spark运行模式 Spark 有很多种模式,最简单就是单机本地模式,还有单机伪分布式模式,复杂的则运行在集群中,目前能很好的运行在 Yarn和 Mesos 中,当然 Spark 还有自带的 Standalone 模式,对于大多数情况 Standalone 模式就足够了,如果企业已经有 Yarn 或者 Mesos 环境,也是很方便部署的. 1.local(本地模式):常用于本地开发测试,本地还分为local单线程和local-cluster多线程; 2.standalone(集群模式):典型的M

  • 解决SpringBoot集成Eureka导致返回结果由json变为xml的问题

    SpringBoot集成Eureka导致返回结果由json变为xml 解决方案 在请求的Mapping上加上 produces = { "application/json;charset=UTF-8" } 例如: @GetMapping(value = "/user-instance", produces = { "application/json;charset=UTF-8" }) 以下是json和xml @GetMapping(value =

  • Springboot集成mybatis实现多数据源配置详解流程

    新建springboot工程,引入web.mysql.mybatis依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</

  • Spring Web MVC和Hibernate的集成配置详解

    网上看到很多关于Spring与Hibernate的集成的文章,奈何由于那些文章写作时间较早,很多都是Spring 3 和Hibernate 4等较旧的版本.所以我在这里使用更新的版本来说明一下. 添加项目依赖 首先我们需要一个Java Web项目,最好使用Maven或Gradle构建工具,方便我们解决软件依赖.我在这里使用Gradle构建工具,构建脚本如下.我们只要引入spring-webmvc和spring-orm这两个包,其他的Spring依赖会自动由构建工具解决.然后还需要引入数据源.Hi

  • SpringBoot登录拦截配置详解(实测可用)

    背景:写一个用户登录拦截,在网上找了一圈没找到好用的,于是自己试验了一下,总结出来,分享给大家. 1.自定义登录拦截器LoginInterceptor public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) thr

  • SpringBoot+docker环境变量配置详解

    项目中遇到springBoot+docker需要配置不同环境变量的问题,做个简单的总结: 1.开发环境ide中启动项目 可以通过ide的环境变量参数配置,启动之后使用哪个配置,比如 这样就使用application-test.yml中的配置 2.通过gradle打包 可以通过-P参数来指定打包后的jar使用哪种环境来运行,比如 gradlew -Pprod bootWar 打包之后运行会使用prod中的配置:我的项目是jhipster生成出来的,现在需要添加test的环境配置,需求修改下项目的g

  • Springboot项目中使用redis的配置详解

    程序结构: 一.配置 1. 在pom.xml中添加依赖 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=&q

随机推荐