springboot整合Activemq,queue和topic两种消息模式

Spring Boot为ActiveMQ配置提供了相关的"Starter",因此整合非常容易。添加ActiveMQ依赖,如下:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
 <dependency>
          <groupId>org.messaginghub</groupId>
          <artifactId>pooled-jms</artifactId>
 </dependency>

然后在applications.properties中进行连接配置,要注意的是发布订阅模式要加上spring.jms.pub-sub-domain=true,点对点与发布订阅不能同时生效,默认是点对点queue。

spring.activemq.broker-url=tcp://localhost:61616
#配置信任所有包,这个配置是为了支持发送对象消息
spring.activemq.packages.trust-all=true
#如果是发布订阅模式要加上这个否则订阅不生效,默认是queue
#spring.jms.pub-sub-domain=true
#true 表示使用内置的MQ,false则连接服务器
spring.activemq.in-memory=false
#true表示使用连接池;false时,每发送一条数据创建一个连接
spring.activemq.pool.enabled=true
#连接池最大连接数
spring.activemq.pool.max-connections=10
#空闲的连接过期时间,默认为30秒
spring.activemq.pool.idle-timeout=30000
#强制的连接过期时间,与idleTimeout的区别在于:idleTimeout是在连接空闲一段时间失效,而expiryTimeout不管当前连接的情况,只要达到指定时间就失效。默认为0,never

创建消息队列Bean

import javax.jms.Queue;
import javax.jms.Topic;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class activemqConfig {
    /**
     * 点对点
     * @return
     */
    @Bean
    Queue queue() {
        return new ActiveMQQueue("ActiveMQQueue");
    }

    /**
     * 发布/订阅
     * @return
     */
    @Bean
    Topic topic(){
        return new ActiveMQTopic("ActiveMQTopic");
    }
}

创建自定义消息体实体类

import java.io.Serializable;
import java.util.Date;

public class Message implements Serializable {
    private String content;
    private Date date;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

创建生产者

import javax.jms.Queue;
import javax.jms.Topic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;

@Component
public class Provider {

    @Autowired
    Queue queue;
    @Autowired
    Topic topic;
    @Autowired
    JmsMessagingTemplate jmsMessagingTemplate;

    public void sendQueue(Message message) {

        jmsMessagingTemplate.convertAndSend(this.queue,message);
    }


    public void sendTopic(Message message) {
        jmsMessagingTemplate.convertAndSend(this.topic,message);
    }
}

创建消费者,@SendTo注解可以收到消费者反馈的信息,返回给监听的"return-queue"队列,要注意的是订阅模式@SendTo不起作用。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;

@Component
public class Consumer {
    @Autowired
    JmsMessagingTemplate jmsMessagingTemplate;
    // 使用JmsListener配置消费者监听的队列
    @JmsListener(destination="ActiveMQQueue")//监听点对点队列
    @SendTo("return-queue")
    public String handleMessageQueue1(Message message) {
        System.out.println("成功接受ActiveMQQueue2" + message.getContent());
        return "成功接受ActiveMQQueue1";
    }
    @JmsListener(destination="ActiveMQQueue")//监听点对点队列 @SendTo返回
    @SendTo("return-queue")
    public String handleMessageQueue2(Message message) {
        System.out.println("成功接受ActiveMQQueue2" + message.getContent());
        return "成功接受ActiveMQQueue2";
    }
 //监听订阅队列,订阅模式 @SendTo无作用,不需要加 @SendTo
    @JmsListener(destination="ActiveMQTopic")
    public void handleMessageTopic1(Message message) {
        System.out.println("成功接受ActiveMQTopic1" + message.getContent());
    }
    @JmsListener(destination="ActiveMQTopic")
    public void handleMessageTopic2(Message message) {
        System.out.println("成功接受ActiveMQTopic2" + message.getContent());
    }

    @JmsListener(destination = "return-queue")
    public void Message(String message){
        System.out.println("Product收到:"+message);
    }
}

编写测试类

import com.alibaba.fastjson.JSONObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Date;

@RunWith(SpringRunner.class)
@SpringBootTest
public class test {
    @Autowired
    Provider JmsProvider;
    @Test
    public void content(){
        Message message=new Message();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("email", "wangsheng@163.com");
        jsonObject.put("timestamp", System.currentTimeMillis());
        String jsonString = jsonObject.toJSONString();
        message.setContent(jsonString);
        message.setDate(new Date());
       JmsProvider.sendQueue(message);
       JmsProvider.sendTopic(message);
    }
}

运行测试

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今朝花落悲颜色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值