springboot 集成 activemq

文章目录

一:说明

1-在两个不同的应用发送和接收消息

2-消息发送应用是 e-car 项目,接收端是 tcm-chatgpt项目,当然,同一个项目也是可以发送和接收的

二:e-car项目配置

1 引入activemq依赖

xml 复制代码
<!-- 集成 ActiveMQ -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

2 application启动类配置消息监听

加上 @EnableJms 注解, 开启JMS

java 复制代码
@EnableJms // 开启JMS
@SpringBootApplication(scanBasePackages="com.nrbc.ecar")
@MapperScan("com.nrbc.ecar.dao.mapper")
public class EcarAppClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EcarAppClientApplication.class, args);
    }
}

3 application.yml配置

  • 1 注意: 开启主题策略,默认是关闭 开启主题模式,要设置为true
    如果要使用队列模式,pub-sub-domain 要设置为false jms:
    pub-sub-domain: false
  • 同时使用jms的Queue(队列)和Topic(发布订阅),可查看这边文章: 文章链接
yml 复制代码
spring:
  # activemq相关配置
  activemq:
    broker-url: tcp://localhost:61616
    user: liping
    password: liping
    packages:
      # 配置信任所有的包,这个配置为了支持发送对象消息(如果传递的是对象则需要设置为true,默认是传字符串)
      trust-all: true
  # 开启主题策略,默认是关闭 开启主题模式
  jms:
    pub-sub-domain: true

# 配置activemq队列的名称和主题名称
amq:
  qname:
    queueName-1:
      queueName-1
  topicName:
    name-1:
      topic-prot-1
    name-2:
      topic-prot-2

4 MQConfig.java 配置类

java 复制代码
/**
 * 专门配置mq通道的配置类
 */
@Slf4j
@Configuration
public class MQConfig {

    @Value("${amq.topicName.name-1}")
    private String tpName;

    @Bean(name = "queueName")
    Queue queueName() {
        return new ActiveMQQueue("test_queue");
    }

    /**
     * 主题(发布\订阅模式)通道
     * @author kazaf
     * @date 2024/4/24 16:43
     */
    @Bean(name = "topic1")
    Topic queueFind() {
        log.info("${amq.topicName.name-1}=" + tpName);
        return new ActiveMQTopic("topic-model");
    }

    @Bean(name = "topic2")
    Topic topic2() {
        return new ActiveMQTopic("topic-model2");
    }

    @Bean(name = "topic3")
    Topic topic3() {
        return new ActiveMQTopic(tpName);
    }

}

5 ecar 项目中的监听

java 复制代码
/**
 * 专门配置mq通道的配置类
 */
@Slf4j
@Component
public class MQListener {
 
 
    /*@JmsListener(destination = "test_queue")
    public void jiant (String message) {

        System.out.println("监听到消息》:" + message);
        log.info("监听到消息---》:" + message);
    }*/

    @JmsListener(destination = "topic-model")
    public void reciveTopic(String message) {
        log.info("11接收主题消息》:"+message);
    }

    @JmsListener(destination = "topic-model2")
    public void topicReceive2(String message) {
        log.info("topic-2监听到消息---》:" + message);
    }

    /**
     * 主题名称从配置文件中动态获取 
     */
    @JmsListener(destination = "${amq.topicName.name-1}")
    public void topicReceive3(String message) {
        log.info("topic-3监听到消息---》:" + message);
    }
 
}

6 junit 发送消息

  • 调用类需要注入消息模板,队列名称或者主题名称
    也可以编写接口发送,demo随个人习惯
java 复制代码
@Slf4j
@SpringBootTest(classes = EcarAppClientApplication.class)
@RunWith(SpringRunner.class)
public class ActivemqTest {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private Queue queueName;
    @Autowired
    private Topic topic1;
    @Autowired
    private Topic topic2;
    @Autowired
    private Topic topic3;

    @Test
    public void queueSender()  {
        String message="我是队列发出的信息";
        jmsMessagingTemplate.convertAndSend(queueName, message);
        log.info("queueSender发送--》:"+message);
//        TimeUnit.SECONDS.sleep(60);
    }

    /**
     * 发送 主题消息(广播)
     * @author kazaf
     * @date 2024/4/24 17:09
     */
    @Test
    public void topicSender()  {
        String message="我是topic-1a";
        jmsMessagingTemplate.convertAndSend(topic1, message);
        log.info("topicSender发送--》:"+message);

        String message2="我是topic2";
        jmsMessagingTemplate.convertAndSend(topic2, message2);
        log.info("topic2Sender发送--》:"+message2);

        String message3="我是topic3发送的";
        jmsMessagingTemplate.convertAndSend(topic3, message3);
        log.info("topic3Sender发送--》:"+message3);

    }
}

三:tcm-chatgpt项目配置

  • 1、2、3、5 跟e-car项目一样的配置

5 MQListener.java 监听消息

代码

java 复制代码
/**
 * @Description: mq监听类
 * @Author: kazaf
 * @Date: 2024-04-24 9:34
 */
@Slf4j
@Component
public class MQListener {

    @JmsListener(destination = "test_queue")
    public void onMessage(String message) {
        System.out.print(message);
        //获取到消息后可以干一些事情
        log.info("恰恰监听到的消息》:"+message);
    }

    @JmsListener(destination = "topic-model")
    public void reciveTopic(String message) {
        log.info("11接收主题消息》:"+message);
    }

    @JmsListener(destination = "topic-model2")
    public void reciveTopic2(String message) {
        log.info("22接收主题消息》:"+message);
    }
}

三 测试

启动activemq服务

  • window端直接启动 bin\win64\activemq.bat 批处理文件

  • 访问 http://localhost:8161 输入 admin / admin 的默认用户名密码登录(根据自己是否修改过)

  • 启动tcm-chatgpt服务

  • 启动e-car服务

  • 运行 ActivemqTest.java 测试类中的 queue发送消息或者Topic发送消息

    队列

发布订阅模式

四:发送对象消息

配置队列名称

java 复制代码
/**
 * 专门配置mq通道的配置类
 */
@Slf4j
@Configuration
public class MQConfig {

    /**
     *
     * @author kazaf
     * @date 2024/4/25 10:51
     */
    @Bean(name = "textMessageQueue")
    Queue textMessageQueue() {
        return new ActiveMQQueue("textMessage-queue");
    }

    @Bean(name = "objMessageQueue")
    Queue objMessageQueue() {
        return new ActiveMQQueue("objMessage-queue");
    }
}

开启监听

java 复制代码
@Slf4j
@Component
public class MQListener {
    /**
     * 主题名称从配置文件中动态获取
     */
    @JmsListener(destination = "textMessage-queue")
    public void queueTextMessageReceive(String message) throws JMSException {

        log.info("queueTextMessageReceive监听到消息---》:" + message);
    }

    @JmsListener(destination = "objMessage-queue")
    public void queueMapMessageReceive(Map<String,Object> map)  {
        log.info("queueObjMessageReceive-Map-监听到消息---》:"
                + map.get("name")+"--money="+map.get("money"));
    }

    /**
     * 主题名称从配置文件中动态获取
     */
    @JmsListener(destination = "objMessage-queue")
    public void queueObjMessageReceive(Message message) throws JMSException {
        if (message instanceof TextMessage) {
            log.info("queueObjMessageReceive-Text-监听到消息---》:" + ((TextMessage) message).getText());
        } else if (message instanceof MapMessage) {
            MapMessage mapMessage = (MapMessage) message;
            log.info("queueObjMessageReceive-Map-监听到消息---》:"
                    + mapMessage.getString("name")+"--money="+mapMessage.getString("money"));
        } else if (message instanceof ObjectMessage) {
            ObjectMessage objectMessage = (ObjectMessage) message;
            User user = (User) objectMessage.getObject();
            log.info("queueObjMessageReceive-obj-监听到消息---》:" + user);
        }
        log.info("queueObjMessageReceive-监听到消息--");
    }

测试类

java 复制代码
@Slf4j
@SpringBootTest(classes = EcarAppClientApplication.class)
@RunWith(SpringRunner.class)
public class ActivemqTest {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private JmsTemplate jmsTemplate;

    @Autowired
    private Queue textMessageQueue;
    @Autowired
    private Queue objMessageQueue;
    

    @Test
    public void senderTextMessage() {
        jmsTemplate.send(textMessageQueue, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = session.createTextMessage();
                message.setText("发送TextMessage消息");
                return message;
            }
        });
    }

    @Test
    public void senderObjMessage() {
        /*
        User user = new User();
        user.setUsername("李哥哥");
        user.setPassword("mima123");
        jmsMessagingTemplate.convertAndSend(objMessageQueue, user);
        */
        Map<String, Object> map = new HashMap<>();
        map.put("name", "掐果果");
        map.put("money", 1231111111.55);
        jmsMessagingTemplate.convertAndSend(objMessageQueue, map);

    }
}

接收ObjectMessage的消息

Map接收的消息

相关推荐
c_zyer19 分钟前
FreeSWITCH与Java交互实战:从EslEvent解析到Spring Boot生态整合的全指南
spring boot·netty·freeswitch·eslevent
郝学胜-神的一滴21 分钟前
Spring Boot Actuator 保姆级教程
java·开发语言·spring boot·后端·程序人生
斜月1 小时前
Springboot 项目加解密的那些事儿
spring boot·后端
草莓爱芒果1 小时前
Spring Boot中使用Bouncy Castle实现SM2国密算法(与前端JS加密交互)
java·spring boot·算法
汤姆yu3 小时前
基于springboot的快递分拣管理系统
java·spring boot·后端
你知道烟火吗6 小时前
谈谈对反射的理解?
java·开发语言·spring boot·后端
it自6 小时前
Redisson在Spring Boot项目中的集成与实战
java·spring boot·redis·后端·缓存
我命由我123458 小时前
Spring Boot 项目问题:Web server failed to start. Port 5566 was already in use.
java·前端·jvm·spring boot·后端·spring·java-ee
热河暖男10 小时前
Spring Boot AI 极速入门:解锁智能应用开发
java·人工智能·spring boot·ai编程