最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring?boot學(xué)習(xí)筆記之操作ActiveMQ指南

 更新時(shí)間:2021年11月25日 11:19:01   作者:寒生1988  
ActiveMQ是一種開(kāi)源的基于JMS規(guī)范的一種消息中間件的實(shí)現(xiàn),ActiveMQ的設(shè)計(jì)目標(biāo)是提供標(biāo)準(zhǔn)的,面向消息的,能夠跨越多語(yǔ)言和多系統(tǒng)的應(yīng)用集成消息通信中間件,這篇文章主要給大家介紹了關(guān)于spring?boot學(xué)習(xí)筆記之操作ActiveMQ指南的相關(guān)資料,需要的朋友可以參考下

前言

消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件,主要解決應(yīng)用耦合、異步消息、流量削鋒等問(wèn)題,實(shí)現(xiàn)高性能、高可用、可伸縮和最終一致性架構(gòu),是大型分布式系統(tǒng)不可缺少的中間件。

目前在生產(chǎn)環(huán)境中使用較多的消息隊(duì)列有 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ 等。

特性

  • 異步性:將耗時(shí)的同步操作通過(guò)以發(fā)送消息的方式進(jìn)行了異步化處理,減少了同步等待的時(shí)間。
  • 松耦合:消息隊(duì)列減少了服務(wù)之間的耦合性,不同的服務(wù)可以通過(guò)消息隊(duì)列進(jìn)行通信,而不用關(guān)心彼此的實(shí)現(xiàn)細(xì)節(jié),只要定義好消息的格式就行。
  • 分布式:通過(guò)對(duì)消費(fèi)者的橫向擴(kuò)展,降低了消息隊(duì)列阻塞的風(fēng)險(xiǎn),以及單個(gè)消費(fèi)者產(chǎn)生單點(diǎn)故障的可能性(當(dāng)然消息隊(duì)列本身也可以做成分布式集群)。
  • 可靠性:消息隊(duì)列一般會(huì)把接收到的消息存儲(chǔ)到本地硬盤(pán)上(當(dāng)消息被處理完之后,存儲(chǔ)信息根據(jù)不同的消息隊(duì)列實(shí)現(xiàn),有可能將其刪除),這樣即使應(yīng)用掛掉或者消息隊(duì)列本身掛掉,消息也能夠重新加載。

JMS 規(guī)范

JMS 即 Java 消息服務(wù)(Java Message Service)應(yīng)用程序接口,是一個(gè) Java 平臺(tái)中關(guān)于面向消息中間件(MOM)的 API,用于在兩個(gè)應(yīng)用程序之間,或分布式系統(tǒng)中發(fā)送消息,進(jìn)行異步通信。Java 消息服務(wù)是一個(gè)與具體平臺(tái)無(wú)關(guān)的 API,絕大多數(shù) MOM 提供商都對(duì) JMS 提供支持。

JMS 的消息機(jī)制有 2 種模型,一種是 Point to Point,表現(xiàn)為隊(duì)列的形式,發(fā)送的消息,只能被一個(gè)接收者取走;另一種是 Topic,可以被多個(gè)訂閱者訂閱,類(lèi)似于群發(fā)。

ActiveMQ 是 JMS 的一個(gè)實(shí)現(xiàn)。

ActiveMQ 介紹

ActiveMQ 是 Apache 軟件基金下的一個(gè)開(kāi)源軟件,它遵循 JMS1.1 規(guī)范(Java Message Service),是消息驅(qū)動(dòng)中間件軟件(MOM)。它為企業(yè)消息傳遞提供高可用、出色性能、可擴(kuò)展、穩(wěn)定和安全保障。ActiveMQ 使用 Apache 許可協(xié)議,因此,任何人都可以使用和修改它而不必反饋任何改變。

ActiveMQ 的目標(biāo)是在盡可能多的平臺(tái)和語(yǔ)言上提供一個(gè)標(biāo)準(zhǔn)的,消息驅(qū)動(dòng)的應(yīng)用集成。ActiveMQ 實(shí)現(xiàn) JMS 規(guī)范并在此之上提供大量額外的特性。ActiveMQ 支持隊(duì)列和訂閱兩種模式的消息發(fā)送。

Spring Boot 提供了 ActiveMQ 組件 spring-boot-starter-activemq,用來(lái)支持 ActiveMQ 在 Spring Boot 體系內(nèi)使用,下面我們來(lái)詳細(xì)了解如何使用。

添加依賴(lài)

主要添加組件:spring-boot-starter-activemq。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

配置文件

在 application.properties 中添加配置。

# 基于內(nèi)存的 ActiveMQ
spring.activemq.in-memory=true
# 不適應(yīng)連接池
spring.activemq.pool.enabled=false
 
# 獨(dú)立安裝的 ActiveMQ
#spring.activemq.broker-url=tcp://192.168.0.1:61616
#spring.activemq.user=admin
#spring.activemq.password=admin

在使用 ActiveMQ 時(shí)有兩種使用方式,一種是使用獨(dú)立安裝的 ActiveMQ,在生產(chǎn)環(huán)境推薦使用這種;另一種是使用基于內(nèi)存 ActiveMQ ,在調(diào)試階段建議使用這種方式。

隊(duì)列(Queue)

隊(duì)列發(fā)送的消息,只能被一個(gè)消費(fèi)者接收。

創(chuàng)建隊(duì)列

@Configuration
public class MqConfig {
    @Bean
    public Queue queue() {
        return new ActiveMQQueue("neo.queue");
    }
}

使用 @Configuration 注解在項(xiàng)目啟動(dòng)時(shí),定義了一個(gè)隊(duì)列 queue 命名為:neo.queue。

消息生產(chǎn)者

創(chuàng)建一個(gè)消息的生產(chǎn)者:

@Component
public class Producer{
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private Queue queue;
    public void sendQueue(String msg) {
        System.out.println("send queue msg :"+msg);
        this.jmsMessagingTemplate.convertAndSend(this.queue, msg);
    }
}

JmsMessagingTemplate 是 Spring 提供發(fā)送消息的工具類(lèi),使用 JmsMessagingTemplate 和創(chuàng)建好的 queue 對(duì)消息進(jìn)行發(fā)送。

消息消費(fèi)者

@Component
public class Consumer {
 
    @JmsListener(destination = "neo.queue")
    public void receiveQueue(String text) {
        System.out.println("Consumer queue msg : "+text);
    }
}

使用注解 @JmsListener(destination = "neo.queue"),表示此方法監(jiān)控了名為 neo.queue 的隊(duì)列。當(dāng)隊(duì)列 neo.queue 中有消息發(fā)送時(shí)會(huì)觸發(fā)此方法的執(zhí)行,text 為消息內(nèi)容。

測(cè)試

創(chuàng)建 SampleActiveMqTests 測(cè)試類(lèi),注入創(chuàng)建好的消息生產(chǎn)者。

@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleActiveMqTests {
    @Autowired
    private Producer producer;
    @Rule
    public OutputCapture outputCapture = new OutputCapture();
}

OutputCapture 是 Spring Boot 提供的一個(gè)測(cè)試類(lèi),它能捕獲 System.out 和 System.err 的輸出,我們可以利用這個(gè)特性來(lái)判斷程序中的輸出是否執(zhí)行。

@Test
public void sendSimpleQueueMessage() throws InterruptedException {
    this.producer.sendQueue("Test queue message");
    Thread.sleep(1000L);
    assertThat(this.outputCapture.toString().contains("Test queue")).isTrue();
}

創(chuàng)建測(cè)試方式,使用 producer 發(fā)送消息,為了保證容器可以接收到消息,讓測(cè)試方法等待 1 秒,最后使用 outputCapture 判斷是否執(zhí)行成功。

測(cè)試多消費(fèi)者

上面的案例只是一個(gè)生產(chǎn)者一個(gè)消費(fèi)者,我們?cè)谀M一個(gè)生產(chǎn)者和多個(gè)消費(fèi)者隊(duì)列的執(zhí)行情況。我們復(fù)制上面的消費(fèi)者 Consumer 重新命名為 Consumer2,并且將輸出內(nèi)容加上 2 的關(guān)鍵字,如下:

@Component
public class Consumer2 {
    @JmsListener(destination = "neo.queue")
    public void receiveQueue(String text) {
        System.out.println("Consumer2 queue msg : "+text);
    }
}

在剛才的測(cè)試類(lèi)中添加一個(gè) send100QueueMessage() 方法,模式發(fā)送 100 條消息時(shí),兩個(gè)消費(fèi)者是如何消費(fèi)消息的。

@Test
public void send100QueueMessage() throws InterruptedException {
    for (int i=0;i<100;i++){
        this.producer.sendQueue("Test queue message"+i);
    }
    Thread.sleep(1000L);
}

控制臺(tái)輸出結(jié)果:

Consumer queue msg : Test queue message0

Consumer2 queue msg : Test queue message1

Consumer queue msg : Test queue message2

Consumer2 queue msg : Test queue message3

...

根據(jù)控制臺(tái)輸出的消息可以看出,當(dāng)有多個(gè)消費(fèi)者監(jiān)聽(tīng)一個(gè)隊(duì)列時(shí),消費(fèi)者會(huì)自動(dòng)均衡負(fù)載的接收消息,并且每個(gè)消息只能有一個(gè)消費(fèi)者所接收。

注意:控制臺(tái)輸出 javax.jms.JMSException: peer (vm://localhost#1) stopped. 報(bào)錯(cuò)信息可以忽略,這是 Info 級(jí)別的錯(cuò)誤,是 ActiveMQ 的一個(gè) bug。

廣播(Topic)

廣播發(fā)送的消息,可以被多個(gè)消費(fèi)者接收。

創(chuàng)建 Topic

@Configuration
public class MqConfig {
    @Bean
    public Topic topic() {
        return new ActiveMQTopic("neo.topic");
    }
}

使用 @Configuration 注解在項(xiàng)目啟動(dòng)時(shí),定義了一個(gè)廣播 Topic 命名為:neo.topic。

消息生產(chǎn)者

創(chuàng)建一個(gè)消息的生產(chǎn)者:

@Component
public class Producer{
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private Topic topic;
    public void sendTopic(String msg) {
        System.out.println("send topic msg :"+msg);
        this.jmsMessagingTemplate.convertAndSend(this.topic, msg);
    }
}

和上面的生產(chǎn)者對(duì)比只是 convertAndSend() 方法傳入的第一個(gè)參數(shù)變成了 Topic。

消息消費(fèi)者

@Component
public class Consumer {
 
    @JmsListener(destination = "neo.topic")
    public void receiveTopic(String text) {
        System.out.println("Consumer topic msg : "+text);
    }
}

消費(fèi)者也沒(méi)有變化,只是監(jiān)聽(tīng)的名改為上面的 neo.topic,因?yàn)槟M多個(gè)消費(fèi)者,復(fù)制一份 Consumer 命名為 Consumer2,代碼相同在輸出中標(biāo)明來(lái)自 Consumer2。

測(cè)試

創(chuàng)建 SampleActiveMqTests 測(cè)試類(lèi),注入創(chuàng)建好的消息生產(chǎn)者。

@Test
public void sendSimpleTopicMessage() throws InterruptedException {
    this.producer.sendTopic("Test Topic message");
    Thread.sleep(1000L);
}

測(cè)試方法執(zhí)行成功后,會(huì)看到控制臺(tái)輸出信息,如下:

send topic msg :Test Topic message

Consumer topic msg : Test Topic message

Consumer2 topic msg : Test Topic message

可以看出兩個(gè)消費(fèi)者都收到了發(fā)送的消息,從而驗(yàn)證廣播(Topic)是一個(gè)發(fā)送者多個(gè)消費(fèi)者的模式。

同時(shí)支持隊(duì)列(Queue)和廣播(Topic)

Spring Boot 集成 ActiveMQ 的項(xiàng)目默認(rèn)只支持隊(duì)列或者廣播中的一種,通過(guò)配置項(xiàng) spring.jms.pub-sub-domain 的值來(lái)控制,true 為廣播模式,false 為隊(duì)列模式,默認(rèn)情況下支持隊(duì)列模式。

如果需要在同一項(xiàng)目中既支持隊(duì)列模式也支持廣播模式,可以通過(guò) DefaultJmsListenerContainerFactory 創(chuàng)建自定義的 JmsListenerContainerFactory 實(shí)例,之后在 @JmsListener 注解中通過(guò) containerFactory 屬性引用它。

分別創(chuàng)建兩個(gè)自定義的 JmsListenerContainerFactory 實(shí)例,通過(guò) pubSubDomain 來(lái)控制是支持隊(duì)列模式還是廣播模式。

@Configuration
@EnableJms
public class ActiveMQConfig {
 
    @Bean("queueListenerFactory")
    public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(false);
        return factory;
    }
 
    @Bean("topicListenerFactory")
    public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(true);
        return factory;
    }
}

然后在消費(fèi)者接收的方法中,指明使用 containerFactory 接收消息。

@Component
public class Consumer {
 
    @JmsListener(destination = "neo.queue", containerFactory = "queueListenerFactory")
    public void receiveQueue(String text) {
        System.out.println("Consumer queue msg : "+text);
    }
 
    @JmsListener(destination = "neo.topic", containerFactory = "topicListenerFactory")
    public void receiveTopic(String text) {
        System.out.println("Consumer topic msg : "+text);
    }
}

改造完成之后,再次執(zhí)行隊(duì)列和廣播的測(cè)試方法,就會(huì)發(fā)現(xiàn)項(xiàng)目同時(shí)支持了兩種類(lèi)型的消息收發(fā)。

總結(jié)

消息中間件廣泛應(yīng)用在大型互聯(lián)網(wǎng)架構(gòu)中,利用消息中間件隊(duì)列和廣播各自的特性可以支持很多業(yè)務(wù),比如群發(fā)發(fā)送短信、給單個(gè)用戶(hù)發(fā)送郵件等。ActiveMQ 是一款非常流行的消息中間件,它的特點(diǎn)是部署簡(jiǎn)單、使用方便,比較適合中小型團(tuán)隊(duì)。Spring Boot 提供了集成 ActiveMQ 對(duì)應(yīng)的組件,在 Spring Boot 中使用 ActiveMQ 只需要添加相關(guān)注解即可。

到此這篇關(guān)于spring?boot學(xué)習(xí)筆記之操作ActiveMQ指南的文章就介紹到這了,更多相關(guān)spring?boot操作ActiveMQ指南內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java文件操作之序列化與對(duì)象處理流詳解

    Java文件操作之序列化與對(duì)象處理流詳解

    這篇文章主要為大家詳細(xì)介紹了Java文件操作中的序列化與對(duì)象處理流,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09
  • Spring Cloud Feign請(qǐng)求添加headers的實(shí)現(xiàn)方式

    Spring Cloud Feign請(qǐng)求添加headers的實(shí)現(xiàn)方式

    這篇文章主要介紹了Spring Cloud Feign請(qǐng)求添加headers的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • JDK14之jpackage打包命令的使用

    JDK14之jpackage打包命令的使用

    這篇文章主要介紹了JDK14之jpackage打包命令的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java實(shí)現(xiàn)的生成二維碼和解析二維碼URL操作示例

    Java實(shí)現(xiàn)的生成二維碼和解析二維碼URL操作示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的生成二維碼和解析二維碼URL操作,結(jié)合實(shí)例形式分析了Java創(chuàng)建與解析二維碼,以及文件讀寫(xiě)等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Spring+Mybatis+Mysql搭建分布式數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)框架的方法

    Spring+Mybatis+Mysql搭建分布式數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)框架的方法

    這篇文章主要介紹了Spring+Mybatis+Mysql搭建分布式數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)框架的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-03-03
  • Mybatis Update操作返回值問(wèn)題

    Mybatis Update操作返回值問(wèn)題

    在獲取update操作的返回值時(shí)遇到了一個(gè)問(wèn)題,似乎 Mybatis 進(jìn)行 update 操作得到的 int 返回值并不是影響的行數(shù),下面通過(guò)本文給大家分享Mybatis Update操作返回值問(wèn)題,需要的朋友參考下吧
    2017-09-09
  • MyBatis Generator去掉生成的注解

    MyBatis Generator去掉生成的注解

    這篇文章主要介紹了MyBatis Generator去掉生成的注解的相關(guān)資料,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • 如何獲取MyBatis Plus執(zhí)行的完整的SQL語(yǔ)句

    如何獲取MyBatis Plus執(zhí)行的完整的SQL語(yǔ)句

    這篇文章主要介紹了如何獲取MyBatis Plus執(zhí)行的完整的SQL語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 自定義類(lèi)加載器的父類(lèi)為何是AppClassLoader說(shuō)明

    自定義類(lèi)加載器的父類(lèi)為何是AppClassLoader說(shuō)明

    這篇文章主要介紹了自定義類(lèi)加載器的父類(lèi)為何是AppClassLoader說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出

    使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出

    這篇文章主要介紹了使用SpringBoot與EasyExcel實(shí)現(xiàn)復(fù)雜的導(dǎo)入導(dǎo)出,EasyExcel是一個(gè)快速解決大文件內(nèi)存溢出的Excel處理工具,它能讓你在不用考慮性能、內(nèi)存等因素的情況下,快速完成Excel的讀、寫(xiě)等功能,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

沙河市| 抚宁县| 勃利县| 梅州市| 泸溪县| 中超| 通山县| 高邮市| 蕉岭县| 大洼县| 溆浦县| 六盘水市| 色达县| 元朗区| 临汾市| 安阳市| 贺州市| 芒康县| 闵行区| 盱眙县| 高青县| 大悟县| 贵州省| 松滋市| 盐亭县| 开封市| 漳浦县| 三河市| 图们市| 兴城市| 邮箱| 遵化市| 昌吉市| 余庆县| 昌邑市| 扎兰屯市| 前郭尔| 青海省| 莎车县| 叶城县| 正阳县|