Activemq的简单操作

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);

        }

    }

}

打开测试用例,消息提供者便会发送消息,而消息的消费者就会消费消息。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章