刚好最近同事问我activemq的问题刚接触所以分不清,前段时间刚好项目中有用到,所以稍微整理了一下,仅用于使用
1.下载ActiveMQ
地址:http://activemq.apache.org/download.html
2.启动ActiceMQ
windows版本直接双击启动bin/win64/activemq.bat
linux版本也是下载解压在bin/linux-x86-64或者linux-x86-32下
cd apache-activemq-5.14.1/bin/linux-x86-64/
./activemq start
启动完成之后,浏览器输入:http://localhost:8161/admin 会显示如下界面就证明成功了
浏览器输入:http://localhost:8161/admin/queues.jsp 需要输入账户密码默认:admin/admin
则会显示消息队列主题等信息
3.Springboot配置ActiveMQ
加入activemq 依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency>
配置连接属性:
如果是properties后缀文件
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=false
如果是yml后缀文件
spring:
profiles : dev
application:
name: user-service
activemq:
broker-url: tcp://localhost:61616
user: admin
password: admin
in-memory: true
pool:
enabled: true
max-connections: 500
4.消息队列的使用
生产者、消费者模式
创建生产者
package org.tfkf.minsurance.jms.activemq; import javax.jms.Destination; import org.apache.activemq.command.ActiveMQQueue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Component; /** * * @Author zyt * @Date 2018/3/15 17:39 */ @Component public class Producer { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; /** * 消息发送 * @param destinationName * @param message * @return */ public boolean sendMessage(final String message,String destinationName) { boolean result = true; try { Destination destination = new ActiveMQQueue(destinationName); jmsMessagingTemplate.convertAndSend(destination, message); } catch (Exception e) { e.printStackTrace(); result = false; } return result; } }
创建消费者,@JmsListener注解,在java7及以下版本jdk中,可以使用@JmsListeners代替它。
@JmsListener(destination = "name.msg") public void receive(String message){ System.out.println("name.msg消费者:"+message); }
我们封装一个调用例子
调用实例
返回结果
5.发布/订阅模式
先发布一个话题
package org.tfkf.minsurance.jms.activemq; import javax.jms.Destination; import org.apache.activemq.command.ActiveMQTopic; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Component; /** * * @Author zyt * @Date 2018/3/15 17:40 */ @Component public class Producer { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; /** * 发布者 发布topic * @param destinationName * @param message * @return */ public boolean publish(String destinationName, final String message) { boolean result = true; try { Destination destination = new ActiveMQTopic(destinationName); jmsMessagingTemplate.convertAndSend(destination, message); } catch (Exception e) { e.printStackTrace(); result = false; } return result; } }
订阅者
package org.tfkf.minsurance.jms.activemq; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; /** * * @Author zyt * @Date 2018/3/15 17:41 */ @Component public class Consumer { @JmsListener(destination = "login.topic",containerFactory = "myJmsContainerFactory") public void subscribe(String message){ System.out.println("login.topic订阅者一:"+message); } @JmsListener(destination = "login.topic",containerFactory = "myJmsContainerFactory") public void subscribe1(String message){ System.out.println("login.topic订阅者二:"+message); } }
在pub/sub模式中,对消息的监听需要对containerFactory进行以下配置
package org.tfkf.minsurance.user.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
import javax.jms.ConnectionFactory; @Configurationpublic class ConfigBase{ /** * 在pub/sub模式中,对消息的监听需要对containerFactory进行以下配置 * @param connectionFactory * @return */ @Bean public JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory){ SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setPubSubDomain(true); return factory; } }
封装调用
调用实例
返回结果
两种模式实践就ok了