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

作者:蛇皮皮蛋 时间:2022-01-31 05:29:10 

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);
}
}

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

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

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);
}
}

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

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

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

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

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

来源:https://blog.csdn.net/qq_37598011/article/details/81106603

标签:SpringBoot,JmsTemplate,xml,JavaConfig
0
投稿

猜你喜欢

  • java实战之猜字小游戏

    2022-03-31 14:48:01
  • 浅析JDK12的五大重要新特性(推荐)

    2023-01-28 19:09:24
  • 解析Java中如何获取Spring中配置的bean

    2023-07-20 13:35:26
  • Spring Boot使用profile如何配置不同环境的配置文件

    2023-11-25 12:52:36
  • 详解Java Synchronized的实现原理

    2023-11-25 06:04:53
  • android studio编译jar包或者aar包的方法教程详解

    2023-06-18 17:22:32
  • java处理数据库不支持的emoji表情符问题解决

    2021-08-21 00:16:58
  • SpringMVC中@ModelAttribute与@RequestBody的区别及说明

    2023-11-24 12:09:51
  • java环境变量path和classpath的配置

    2023-08-31 01:09:04
  • Springboot创建项目的图文教程(idea版本)

    2022-09-30 13:30:17
  • 基于java构造方法Vector遍历元素源码分析

    2023-11-25 05:21:40
  • Spring Boot自动配置的原理及@Conditional条件注解

    2021-08-31 21:14:11
  • Java实现批量向mysql写入数据的方法

    2023-11-05 20:51:21
  • Java字符串拼接新方法 StringJoiner用法详解

    2022-06-16 13:02:13
  • Java C++ 算法题解拓展leetcode670最大交换示例

    2022-05-18 23:31:51
  • 详解Java注解的实现与使用方法

    2023-10-31 12:33:20
  • IDEA最新版2020.1的maven工程本地依赖仓库无法使用问题(已解决)

    2023-09-21 17:57:00
  • SpringBoot JS-SDK自定义微信分享的实现

    2023-11-10 05:08:28
  • IDEA SpringBoot项目配置热更新的步骤详解(无需每次手动重启服务器)

    2023-11-12 00:22:41
  • 深入理解Java并发编程之ThreadLocal

    2023-11-21 02:43:42
  • asp之家 软件编程 m.aspxhome.com