先来看下什么是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);
}
}
}
- 测试结果