1. 程式人生 > >一:ActiveMQ知識整理

一:ActiveMQ知識整理

component group 如果 適配 返回結果 參與 wire 容器 ddl

一:JMS概念

JMS即Java消息服務(Java Message Service)應用程序接口,是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。Java消息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。JMS是一種與廠商無關的 API,用來訪問收發系統消息,它類似於JDBC(Java Database Connectivity)。

JMS百度百科: https://baike.baidu.com/item/JMS/2836691?fr=aladdin

1.體系架構

JMS由以下元素組成:

JMS提供者:連接面向消息中間件的,JMS接口的一個實現。提供者可以是Java平臺的JMS實現,也可以是非Java平臺的面向消息中間件的適配器。

JMS客戶:生產或消費基於消息的Java的應用程序或對象。

JMS生產者:創建並發送消息的JMS客戶。

JMS消費者:接收消息的JMS客戶。

JMS消息:包括可以在JMS客戶之間傳遞的數據的對象。

JMS隊列:一個容納那些被發送的等待閱讀的消息的區域。與隊列名字所暗示的意思不同,消息的接受順序並不一定要與消息的發送順序相同。一旦一個消息被閱讀,該消息將被從隊列中移走。

JMS主題:一種支持發送消息給多個訂閱者的機制。

2.對象模型
技術分享圖片

JMS對象模型包含如下幾個要素:

1)連接工廠。連接工廠(ConnectionFactory)是由管理員創建,並綁定到JNDI樹中。客戶端使用JNDI查找連接工廠,然後利用連接工廠創建一個JMS連接。

2)JMS連接。JMS連接(Connection)表示JMS客戶端和服務器端之間的一個活動的連接,是由客戶端通過調用連接工廠的方法建立的。

3)JMS會話。JMS會話(Session)表示JMS客戶與JMS服務器之間的會話狀態。JMS會話建立在JMS連接上,表示客戶與服務器之間的一個會話線程。

4)JMS目的。JMS目的(Destination),又稱為消息隊列,是實際的消息源。

5)JMS生產者和消費者。生產者(Message Producer)和消費者(Message Consumer)對象由Session對象創建,用於發送和接收消息。

6)JMS消息通常有兩種類型:

① 點對點(Point-to-Point)。在點對點的消息系統中,消息分發給一個單獨的使用者。點對點消息往往與隊列(javax.jms.Queue)相關聯。

② 發布/訂閱(Publish/Subscribe)。發布/訂閱消息系統支持一個事件驅動模型,消息生產者和消費者都參與消息的傳遞。生產者發布事件,而使用者訂閱感興趣的事件,並使用事件。該類型消息一般與特定的主題(javax.jms.Topic)關聯。

3.模型

Java消息服務應用程序結構支持兩種模型:

點對點或隊列模型 Point-to-Point(P2P)

發布者/訂閱者模型 Publish/Subscribe(Pub/Sub)

1.P2P模式圖:
技術分享圖片

2.涉及到的概念

1.  消息隊列(Queue)
2.  發送者(Sender)
3.  接收者(Receiver)
4.  每個消息都被發送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留著消息,直到他們被消費或超時。

3.P2P的特點

1.每個消息只有一個消費者(Consumer)(即一旦被消費,消息就不再在消息隊列中)
2.發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了消息之後,不管接收者有沒有正在運行,它不會影響到消息被發送到隊列
3.接收者在成功接收消息之後需向隊列應答成功

1.Pub/Sub模式圖
技術分享圖片

2.涉及到的概念

主題(Topic)
發布者(Publisher)
訂閱者(Subscriber) 
客戶端將消息發送到主題。多個發布者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。

3.Pub/Sub的特點

每個消息可以有多個消費者。
發布者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須創建一個訂閱者之後,才能消費發布者的消息,而且為了消費消息,訂閱者必須保持運行的狀態。
為了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發布者的消息。

4.傳遞方式

JMS有兩種傳遞消息的方式。標記為NON_PERSISTENT的消息最多投遞一次,而標記為PERSISTENT的消息將使用暫存後再轉送的機理投遞。如果一個JMS服務離線,那麽持久性消息不會丟失但是得等到這個服務恢復聯機時才會被傳遞。所以默認的消息傳遞方式是非持久性的。即使使用非持久性消息可能降低內務和需要的存儲器,並且這種傳遞方式只有當你不需要接收所有的消息時才使用。

JMS定義了五種不同的消息正文格式,以及調用的消息類型,允許你發送並接收以一些不同形式的數據,提供現有消息格式的一些級別的兼容性。

StreamMessage -- Java原始值的數據流

MapMessage--一套名稱-值對

TextMessage--一個字符串對象

ObjectMessage--一個序列化的 Java對象

BytesMessage--一個未解釋字節的數據流

二:消息中間件概述

1.MOM概述

MOM(Message Oriented Middleware)是面向消息的中間件,使用消息傳送提供者來協調消息傳送操作。MOM 需要提供 API 和管理工具。客戶端使用api調用,把消息發送到由提供者管理的目的地。在發送消息之後,客戶端會繼續執行其他工作,並且在接收方收到這個消息確認之前,提供者一直保留該消息。

2.消息中間件產生的背景

在客戶端與服務器進行通訊時.客戶端調用後,必須等待服務對象完成處理返回結果才能繼續執行。

客戶與服務器對象的生命周期緊密耦合,客戶進程和服務對象進程都都必須正常運行;如果由於服務對象崩潰或者網絡故障導致用戶的請求不可達,客戶會受到異常。

點對點通信:客戶的一次調用只發送給某個單獨的目標對象。

3.什麽是消息中間件

面向消息的中間件(MessageOrlented MiddlewareMOM)較好的解決了以上問題。發送者將消息發送給消息服務器,消息服務器將消息存放在若千隊列中,在合適的時候再將消息轉發給接收者。

這種模式下,發送和接收是異步的,發送者無需等待; 二者的生命周期未必相同: 發送消息的時候接收者不一定運行,接收消息的時候發送者也不一定運行;一對多通信: 對於一個消息可以有多個接收者。

三:springboot整合activemq

springboot2.0整合activemq: https://www.cnblogs.com/toov5/p/9937989.html

1.引入依賴

<!-- 引入web依賴 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- activemq的springboot啟動器 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

2.配置yml文件

spring:
  activemq:
    broker-url: tcp://127.0.0.1:61616
    user: admin
    password: admin
my_queue: springboot-queue
server:
  port: 8080

3.創建QueueConfig類

@Configuration
public class QueueConfig {
    @Value("${my_queue}")
    private String myQueue;
    
    //首先將隊列註入到SpringBoot容器中去
    @Bean
    public Queue logQueue() {
        return new ActiveMQQueue(myQueue);
    }
}

4.創建Producer類

@Component
public class Producer {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    
    //把隊列註入進來
    @Autowired  //此註解默認是以類型找  在配置文件中 已經註入的  @Bean
    private Queue myqueue;
    
    //每隔5s時間向隊列發送消息
    @Scheduled(fixedDelay=5000)
    public void send() {
        String msg = "測試消息隊列"+System.currentTimeMillis();
        System.out.println("msg:"+msg);
        this.jmsMessagingTemplate.convertAndSend(myqueue, msg);
    }
}

5.創建Consumer類

另外新建一個springboot工程,pom文件相同。yaml文件中服務端口號與第一個不同。

spring:
  activemq:
    broker-url: tcp://127.0.0.1:61616
    user: admin
    password: admin
my_queue: springboot-queue
server:
  port: 8081

@Component
public class Consumer {
    //用這個註解去監聽 監聽的隊列
    @JmsListener(destination="${my_queue}")
    public void receive(String msg) {
        System.out.println("消費者接受消息:"+msg);
    }   
}

一:ActiveMQ知識整理