先来看下什么是JMS

JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。

JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。

简单的来说JMS类似接口开发规范,ActiveMQ是对它的具体实现,而ActiveMQ也可以基于其他的规范,比较灵活。

消息队列的使用场景

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题

实现高性能,高可用,可伸缩和最终一致性架构

最近在工作中遇到的一问题场景如下:
我在开发一个关于使用微信借书的系统,当用户选择并借完书后,需要将借阅信息推送给用户的微信。最开始我使用了一个异步的子线程来推送通知服务。但是考虑到之后的扩展,准备用消息队列来解决之后可能会出现的性能问题。

下载并安装ActiveMQ

ActiveMQ下载地址传送门,吐槽一下,下载贼慢

解压下载好的安装包,打开activemq.bat即可开启服务中心

后台监控地址:http://localhost:8161/,默认账号密码都是admin

java代码实现

  • SpringBoot很好的集成了ActiveMQ,我们只需要做简单的配置即可使用强大的MQ
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
  • 配置一下applicationyml
spring
  activemq:
    broker-url: tcp://localhost:61616
    user: admin
    password: admin
  • 创建一个生产者Producer
@Service
public class Producer {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    public void sendMessage(Destination destination,String message){

        jmsMessagingTemplate.convertAndSend(destination,message);

    }
}
  • 创建一个消费者Consumer
@Component
public class Consumer {

    @JmsListener(destination = "test.queue")
    public void receiveQueue(String text) {

        System.out.println("接收到的报文:" + text);

    }
}
  • 创建一个测试用例
@RunWith(SpringRunner.class)
@SpringBootTest
public class JmsTest {

    @Autowired
    private Producer producer;

    @Test
    public void test(){
        Destination destination = new ActiveMQQueue("test.queue");
        for (int i=0;i<100;i++){
            producer.sendMessage(destination,"hello,activeMQ!"+i);
        }

    }
}
  • 测试结果