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就完成了 ,有兴趣的可以自己跑下试试

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,我可以为您简单介绍一下SpringBoot集成ActiveMQ和MQTT实现消息的发送和接收。 首先,您需要在SpringBoot项目中添加ActiveMQ和MQTT的依赖,可以在pom.xml文件中添加如下代码: ```xml <!-- ActiveMQ --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <!-- MQTT --> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> <version>5.5.0</version> </dependency> ``` 接下来,您需要在application.properties中配置ActiveMQ和MQTT的连接信息,例如: ```properties # ActiveMQ spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin # MQTT spring.mqtt.username=admin spring.mqtt.password=admin spring.mqtt.url=tcp://localhost:1883 ``` 然后,您可以通过注入JmsTemplate和MqttPahoMessageHandler来实现消息的发送和接收。例如: ```java // ActiveMQ @Autowired private JmsTemplate jmsTemplate; public void sendMessage(String destination, String message) { jmsTemplate.convertAndSend(destination, message); } @JmsListener(destination = "testQueue") public void receiveMessage(String message) { System.out.println("Received message: " + message); } // MQTT @Autowired private MqttPahoMessageHandler mqttHandler; public void sendMessage(String topic, String message) { mqttHandler.setDefaultTopic(topic); mqttHandler.handleMessage(MessageBuilder.withPayload(message).build()); } @MessageEndpoint public class MqttMessageReceiver { @ServiceActivator(inputChannel = "mqttInputChannel") public void receiveMessage(String message) { System.out.println("Received message: " + message); } } ``` 以上代码中,sendMessage方法用于发送消息,receiveMessage方法用于接收消息。使用JmsTemplate可以很方便地发送和接收ActiveMQ消息,使用MqttPahoMessageHandler和MqttMessageReceiver可以很方便地发送和接收MQTT消息。 这就是SpringBoot集成ActiveMQ和MQTT实现消息发送和接收的基本流程,希望对您有所帮助。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值