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

        }

    }

}

打開測試用例,消息提供者便會發送消息,而消息的消費者就會消費消息。

 

 

 

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