本文選自《spring實戰(第4版)——第17章 spring訊息》從在大學課堂接觸c語言開始,我們進行的函式呼叫一般都是同步的,這樣的呼叫機制一般情況下很容易理解,即使像rmi和webservice那樣的遠端呼叫也是同步的。在同步呼叫機制中,當客戶端呼叫遠端方法時,客戶端必須等到遠端方法完成後,才能繼續執行。
同步通訊有它自己的適用場景。不過,對於開發者而言,這種通訊方式並不是應用程式之間進行互動的唯一方式。非同步訊息是乙個應用程式向另乙個應用程式間接收傳送訊息的一種方式,在這種呼叫機制中,客戶端不需要等待服務處理訊息,甚至不需要等待訊息投遞完成。客戶端傳送訊息,然後繼續執行。
非同步訊息傳送模型類似於郵政系統。我們要給遠方的某個人傳送乙個信件,只要在信件中寫上收件人資訊,交給快遞工作人員,就可以繼續做下一件事。快遞人員通過郵政系統把信件投遞到收件人的信箱中,收件人通過檢視信箱,取出自己的信件。
在非同步訊息中有兩個主要的概念:訊息**(message broker)和目的地(destination)。
當乙個應用傳送訊息時,會將訊息交給乙個訊息**。訊息**實際上類似於郵局。訊息**可以確保訊息被投遞到指定的目的地,同事解放傳送者,使其能夠繼續進行其他業務。
訊息中的目的地相當於收件人的信箱,但並不像信件位址那樣必須標識特定的收件人或街道位址,因為訊息的接收者可能是不同物件中的乙個或多個。目的地通用的有兩種:佇列(queue)和主題(topic),每種型別都與特定的訊息模型相關聯,分別是點對點模型(佇列)和發布/訂閱模型(主題)。
在點對點模型中,每一條訊息都有乙個傳送者和乙個接受者。當訊息**得到訊息時,它將訊息放入乙個佇列中。當接收者請求佇列中的下一條訊息時,訊息會從佇列中取出,並投遞給接收者。因為訊息投遞後會從佇列中刪除,這樣可可以保證訊息只能投遞給乙個接收者。
儘管訊息佇列中的每一條訊息只被投遞給乙個接收者,但並不意味著只能使用乙個接收者從佇列中獲取訊息。事實上,通常可以使用幾個接收者來處理佇列中的訊息。不過,每個接收者都會處理自己所接收到的訊息。
這與在銀行排隊等待類似。在等待時,我們可能注意到很多銀行櫃員都可以幫助我們處理金融業務。在櫃員幫助客戶完成業務後,他就空閒了,此時,他會要求排隊等待的下乙個人前來辦理業務。
從另乙個角度看,我們在銀行排隊時,並不知道哪乙個櫃員會幫助我們辦理業務。我們可能猜測會由哪乙個櫃員辦理我們的業務。但一般情況我們都會猜錯,最終會由另乙個櫃員來辦理。
同樣,在點對點訊息中,如果有多個接收者監聽佇列,我們無法知道某個訊息會由哪乙個接收者處理。實際上,我們也不需要關心由哪乙個接收者會處理哪乙個訊息,我們只需要傳送訊息到佇列,並簡單地為佇列新增***接收訊息。
在發布—訂閱訊息模型中,訊息會傳送給乙個主題。與佇列類似,多個接收者都可以監聽乙個主題。但與佇列不同的是,訊息不再是只投遞給乙個接收者,而是主題的所有訂閱者都會接收到此訊息的副本。
發布—訂閱訊息模型與雜誌發行商和雜誌訂閱者很相似。雜誌(訊息)出版後,傳送給郵局,然後多有的訂閱者都會受到雜誌的副本。
同步訊息和非同步訊息
同步訊息和非同步訊息區別 兩者使用場景不一樣,比如說a給b傳送一封電子郵件,a是不需要知道b是否收到就可以了的,把自己的資訊傳達出去,這樣的場景就是非同步訊息。因為在這個過程中a在乎的是把某件事情傳達出去就可以,而不必在乎其他人的狀態,比如張貼告示也是這樣,不需要知道每個人都是否知道這則告示的內容,...
async task 非同步訊息
async 和 await 是用來定義的非同步方法,async 關鍵字是上下文關鍵字,原因在於只有當它修飾方法 lambda 表示式或匿名方法時,它才是關鍵字。在所有其他上下文中,都會將其解釋為識別符號。如果 async 關鍵字修改的方法不包含 await 表示式或語句,則該方法將同步執行。方法將同...
非同步訊息機制
1.乙個執行緒裡面只有乙個looper。2.子執行緒也可建立handler。前後需分別加上looper.prepare 和looper.loop 標準寫法 looper.prepare handler mhandler newhandler looper.loop 在prepare 中建立loope...