使用 ActiveMQ 的步骤:

  • 引入 ActiveMQ 依赖
  • 配置 ActiveMQ
  • 创建 Producer 发送消息
  • 创建 Consumer 接收消息

官方文档请阅读 ActiveMQ Support,其他:

1. 引入 ActiveMQ 依赖

implementation 'org.springframework.boot:spring-boot-starter-activemq'
# 配置 spring.activemq.pool.enabled=true 时使用连接池需要引入
implementation 'org.messaginghub:pooled-jms'

2. 配置 ActiveMQ

在 application.properties 中配置 ActiveMQ:

spring.activemq.broker-url = tcp://localhost:61616

3. 创建 Producer 发送消息

package com.xtuer.mq;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
public class Producer {
    @Autowired
    private JmsTemplate jmsTemplate;

    public void send(String message) {
        jmsTemplate.convertAndSend("queen", message);
    }
}

向队列 queen 中发射消息,如果队列不存在则会自动创建。

4. 创建 Consumer 接收消息

package com.xtuer.mq;

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

@Component
public class Consumer {
    @JmsListener(destination = "queen")
    public void receive(String message) {
        System.out.println("收到消息: " + message);
    }
}

5. 测试

import com.xtuer.Application;
import com.xtuer.mq.Consumer;
import com.xtuer.mq.Producer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest(classes = {Application.class})
public class ActiveMQTest {
    @Autowired
    private Producer producer;

    @Test
    public void sendMessage() {
        int size = 1000;

        long start = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            producer.send(System.currentTimeMillis() + "");
        }
        long end = System.currentTimeMillis();
        System.out.printf("发送 %d 条消息使用了 %d 毫秒", size, (end-start));
    }
}

启动 ActiveMQ,然后运行上面的程序,可以看到控制台消费者接收到消息的输出,效率为大概每秒 200 个左右。

6. 效率

ActiveMQ 默认使用持久化写入,效率很低,设置 spring.jms.template.delivery-mode=non_persistent 使用非持久化的方式写入可以达到每秒 10000 个,可是一重启 ActiveMQ 后消息就没了,很不安全。

需要高安全性的同时还要高效率,放弃 ActiveMQ 吧,建议实施 Apache RocketMQ

results matching ""

    No results matching ""