SpringBoot JMS(ActiveMQ) 使用實踐


ActiveMQ

1. 下載windows辦的activeMQ后,在以下目錄可以啟動:

    

2. 啟動后會有以下提示

    

3. 所以我們可以通過http://localhost:8161訪問管理頁面,通過tcp://localhost:61616來連接消息服務器,用到的用戶名和密碼都在以下文件中(默認為admin=admin)

    

springboot連接ActiveMQ

1. 加入依賴:

            spring-boot-starter-activemq

2. 配置連接屬性:

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. 創建消費者

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代替它。

    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, 而消費者中,一個收到消息 1、3、5、7、9,另一個收到0、2、4、6、8。

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM