SpringBoot JMS(ActiveMQ) 使用實踐

ActiveMQ

1. 下載windows辦的activeMQ後,在如下目錄能夠啓動:java

    

2. 啓動後會有如下提示spring

    

3. 因此咱們能夠經過http://localhost:8161訪問管理頁面,經過tcp://localhost:61616來鏈接消息服務器,用到的用戶名和密碼都在如下文件中(默認爲admin=admin)apache

    

springboot鏈接ActiveMQ

1. 加入依賴:windows

            spring-boot-starter-activemqspringboot

2. 配置鏈接屬性:bash

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=false

消息的發送和接收

生產者/消費者模式

    1. 建立生產者服務器

package com.example.demo8activemq.jms;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.jms.Destination;

/**
 * @author Created by yawn on 2017-10-26 16:15
 */
@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);
    }
}

    2. 建立消費者tcp

package com.example.demo8activemq.jms;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;

/**
 * @author Created by yawn on 2017-10-26 16:15
 */
@Service
public class Consumer {

    @JmsListener(destination = "test.queue")
    public void receiveMsg(String text) {
        System.out.println("<<<<<<============ 收到消息: " + text);
    }
}

    注意: @JmsListener是一個可重複的註解,在java7及如下版本jdk中,可使用@JmsListeners代替它。spring-boot

    3. 測試類測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class Demo8ActivemqApplicationTests {

	@Resource
	private Producer producer;

	@Test
	public void contextLoads() {
		for (int i = 0; i < 10; i++) {
			producer.sendMsg("test.queue", "Queue Message " + i);
		}
	}
}

    4. 運行測試

發佈/訂閱模式

    1. 發佈話題

package com.example.demo8activemq.jms;

import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.jms.Destination;

/**
 * @author Created by yawn on 2017-10-28 17:09
 */
@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);
    }
}

    2. 訂閱話題

package com.example.demo8activemq.jms;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;

/**
 * @author Created by yawn on 2017-10-28 17:15
 */
@Service
public class Subscriber {

    @JmsListener(destination = "test.topic", containerFactory = "myJmsContainerFactory")
    public void subscribe(String text) {
        System.out.println("===========<<<<<<<<收到訂閱的消息" + text);
    }
}

    注意: 在pub/sub模式中,對消息的監聽須要對containerFactory進行如下配置

@Bean
    JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory){
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(true);
        return factory;
    }

    3. 測試

@Test
	public void test() {
		for (int i = 0; i < 10; i++) {
			publisher.publish("test.topic", "Topic Message " + i);
		}
	}

應用

    按照以上步驟,在springboot中很容易就實現類兩種模式的消息發送和接收。可是jms具體的應用場景是在不一樣的應用程序之間,生產者和消費者每每是在不一樣的應用中的。此外,以上例子中的消息咱們只發送字符串,其實還能夠發送Object類型的消息,甚至可使用messageCreator自定義消息的轉換,而不使用convertAndSend方法默認轉換。

多個應用程序之間發送消息

1. 先使用一個只有發送者,沒有消費者或訂閱者的應用發送兩類消息各十條

    

    

2. 咱們打開localhost:8161,能夠看到

    

    

    兩類都曾有十條消息入隊,但只有queues中還存留10條消息。

3. 如今咱們啓動包含消費者和訂閱者的應用程序

    

    果真,只有消費者收到了queues中的消息。

    這說明訂閱者接收topic是須要在topic發佈以前訂閱;而生產/消費模式下,消息發出後會存放在隊列中,等待消費者消費。

    4. 咱們先啓動兩個包含訂閱者和消費者的程序,再發布消息

    

    

    

    兩個訂閱者都收到 topic message 1~9, 而消費者中,一個收到消息 一、三、五、七、9,另外一個收到0、二、四、六、8。

    這說明有多個消息接收者時,生產/消費模式下多個消費者會輪流消費隊列中的消息,而pub/sub模式下全部訂閱者都會獲得全部的消息。

    以上就是在多個應用程序之間驗證了發佈/訂閱模式和生產/消費模式的不一樣特色。

相關文章
相關標籤/搜索