JMS + ActiveMQ
Posted Java基础学习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JMS + ActiveMQ相关的知识,希望对你有一定的参考价值。
JMS 的全称是 Java Message Service,即 Java 消息服务,ActiveMQ 实现了 JMS 的接口。它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息(生产者和消费者可以在同一个应用中,也可以不在同一个应用中)。应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑。一个典型的应用例如用户注册后需要发送验证邮件,因为发送邮件是一个耗时任务,如果在注册的逻辑代码中发送邮件的话系统的响应就会很慢,可以在用户注册后立即返回,并把发送邮件的任务通过 JMS 发送到消息队列中,然后另一个专门负责发送邮件的服务从 MQ 里获取发送邮件的消息发送邮件。
如果是同一个程序里通讯的话,可以使用 Spring Event。
消息有两种类型:
点对点
: 一个消息只能被一个消费者接收处理发布/订阅模式
: 一个消息能同时被多个消费者接收处理
消息生产者使用步骤:
配置 ConnectionFactory
配置 Destination,也就是队列
创建消息生产者对象
发送消息
消息消费者使用步骤:
配置 ConnectionFactory
创建消息消费者对象
配置消息监听容器
有消息到达时消息的消费者的
onMessage()
方法会被自动调用
程序运行前当然要先启动 ActiveMQ
下面介绍 JMS 的使用,消息的生产者是一个 Web 应用,通过访问 URL 发送消息,消费者是一个普通的 Java 应用程序。
Gradle 依赖
|
|
消息生产者
项目目录
|
|
jms.xml
|
MessageProducer.java
使用
jmsTemplate
进行消息发送
|
ProducerController.java
|
消息消费者
项目目录
|
|
jms.xml
|
一个消息的消费者可以同时接收多个队列里的消息。
上面使用了
jms:listener-container
定义消息监听容器,这种方式比较简洁,推荐使用:
目的地的名字直接使用字符串即可,不需要定义目的地的对象
配置队列的类型:
destination-type
配置 acknowledge:
<jms:listener-container connection-factory="connectionFactory" acknowledge ="client">
当然也可以使用下面的方式定义消息监听容器:
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="messageListener" ref="messageConsumer"/>
<property name="destination" ref="queueDestination"/> <!--队列对象-->
</bean>
或者
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="messageListener" ref="messageConsumer"/>
<property name="destinationName" value="testQueue"/> <!--队列名字-->
</bean>
MessageConsumer.java
|
Main.java
|
测试
访问 http://localhost:8080/test-queue
消息生产者控制台输出: 生产者发了一个消息:Queue: 368904478401020
消息消费者控制台输出: 接收到一个纯文本消息:Queue: 368904478401020
访问 http://localhost:8080/test-topic
消息生产者控制台输出: 生产者发了一个消息:Topic: 365706083141038
消息消费者控制台输出: 接收到一个纯文本消息:Topic: 365706083141038
以上是关于JMS + ActiveMQ的主要内容,如果未能解决你的问题,请参考以下文章