Activemq,消息传送的中间件,用于在两个系统中传送消息,做测试的时候是可以传送字符串。当然也可以传送对象数据信息。
Activemq有两种模式,queue和topic。Queue是队列,有人消费了就消失了,如果是集群的话,集群中的每个系统接收到的消息就会是不一样的。而集群作为一个整体来消费这些消息。Topic是主题与订阅模式,所有订阅了这个消息的系统,都会接收到一套完整的信息,也就是集群中的每个子系统接收到的消息是一致的。
整体环境搭建
安装了apache-activemq-5.15.3-bin.tar.gz包与jdk-8u191-linux-x64.tar.gz包。将这两个解压到/apps/svr/目录下,就算是搭建起来环境了。
启动activemq
cd /apps/svr/apache-activemq-5.15.3/bin
然后输入命令:
./activemq start
完成对activemq的启动。
activemq启动后默认会用到8161端口和61616端口,需要检查这两个端口是否开通。
使用下面的两个命令可以暂时开启两个端口,如需持久化开启端口,参考百度
iptables -I INPUT -p tcp --dport 8161 -j ACCEPT
iptables -I INPUT -p tcp --dport 61616 -j ACCEPT
这样的话,activemq消息中间件就准备齐全了。在浏览器上输入网址http://ip:8161/即可访问active的网页,密码为admin/admin.
activemq的操作
首先https://start.spring.io/下载两个springboot初始化项目,一个用于做消息的生产者provider,一个是消息的消费者consumer。
项目下载完成后导入eclipse中,在pom.xml文件中增加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
然后在application.properties中添加相关配置信息。
spring.activemq.broker-url=tcp://ip:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=false
server.port=9091(因为每个项目中默认为8080端口,所以需要修改端口号,以免出现端口被占用的情况)
queue模式
新建一个Consumer.java类,编写如下信息:
import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Service;
@Service public class Consumer {
@JmsListener(destination = "test.queueue") public void receiveMsg(String text) { System.out.println("<<<<<<<================收到消息:" + text); } } |
这样便有了一个消费者
在另一个项目中新建一个Producer.java类,编写如下信息:
import javax.annotation.Resource; import javax.jms.Destination;
import org.apache.activemq.command.ActiveMQQueue; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service;
@Service public class Producer {
@Resource private JmsMessagingTemplate jmsMessagingTemplate;
public void sendMsg(String destinationName, String message) { System.out.println("================发送queue消息为================"+message); Destination destination = new ActiveMQQueue(destinationName); jmsMessagingTemplate.convertAndSend(destination, message); } } |
这样便有了一个消息的提供者,在消息的提供者中编写测试用例如下:
import javax.annotation.Resource;
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class) @SpringBootTest public class DemoApplicationTests {
@Resource private Producer producer;
@Test public void sendMsgTest() { for(int i=0; i < 10; i++) { producer.sendMsg("test.queueue", "queue message=======" + i); } } }
|
打开测试用例,消息提供者便会发送消息,而消息的消费者就会消费消息。
Topic模式
Topic模式与queue步骤是一样的,只是个别类有些不同。
新建一个Subscriber.java类,编写如下信息:
import javax.jms.ConnectionFactory;
import org.springframework.context.annotation.Bean; import org.springframework.jms.annotation.JmsListener; import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.config.SimpleJmsListenerContainerFactory; import org.springframework.stereotype.Service;
@Service public class Subscriber {
@JmsListener(destination="test.topic", containerFactory="myJmsContainerFactory") public void subscribe(String text) { System.out.println("===================<<<<<收到订阅的消息" + text); }
@Bean JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory){ SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setPubSubDomain(true); return factory; } }
|
这样便有了一个消费者
在另一个项目中新建一个Publisher.java类,编写如下信息:
import javax.annotation.Resource; import javax.jms.Destination;
import org.apache.activemq.command.ActiveMQTopic; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service;
@Service public class Publisher {
@Resource private JmsMessagingTemplate jmsMessagingTemplate;
public void publish(String destinationName, String message) { Destination destination = new ActiveMQTopic(destinationName); System.out.println("==============>>>>>>发布topic消息" + message); jmsMessagingTemplate.convertAndSend(destination, message); } } |
这样便有了一个消息的提供者,在消息的提供者中编写测试用例如下:
import javax.annotation.Resource;
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class) @SpringBootTest public class DemoApplicationTests { @Resource private Publisher publisher;
@Test public void sendMsgTopicTest() { for(int i=0; i < 10; i++) { publisher.publish("test.topic", "topic message=======" + i); } } } |
打开测试用例,消息提供者便会发送消息,而消息的消费者就会消费消息。