首頁 >Java >java教程 >Java中訊息佇列的範例程式碼分享

Java中訊息佇列的範例程式碼分享

黄舟
黄舟原創
2017-07-24 15:37:521973瀏覽

這篇文章主要介紹了Java訊息佇列的簡單實作程式碼,小編覺得還挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

今天看到我們的招募資訊有對訊息佇列有要求,然後就思索了一翻,網路上一搜一大堆。

我可以舉個小例子先說明應用場景

假設你的伺服器每分鐘的處理量為200個,但客戶端再峰值的時候可能一分鐘會發1000個訊息給你,這時候你就可以把他做成隊列,然後按正常有序的處理,先進後出(LIFO),先進先出(FIFO)可依自己的情況定奪

stack  先進後出(LIFO)--------Java 對應的類別Stack

佇列先進先出( FIFO)--------java對應的類別Queue

這兩種都可用Linkedlist進行封裝和實現,下面是我自己寫的一個棧的例子


#
/** 
 * @author 刘伊凡 
 * --------->>>>>>队列的实现-------------- 
 */ 
public class MyStack<T> { 
  private LinkedList<T> storage = new LinkedList<T>(); 
 
  public synchronized void push(T e) {//需要加上同步 
    storage.addFirst(e); 
  } 
 
  public T peek() { 
    return storage.getFirst(); 
  } 
 
  public void pop() { 
    storage.removeFirst(); 
  } 
 
  public boolean empty() { 
    return storage.isEmpty(); 
  } 
 
  @Override 
  public String toString() { 
    return storage.toString(); 
  } 
 
}

下面是一個測試類別


/** 
 * @author 刘伊凡 
 * 
 */ 
public class StackTest { 
  public static void main(String[] args) { 
    MyStack<String> stack = new MyStack<String>(); 
    for(String s : "the prefect code".split(" ")){//LIFO 
      stack.push(s); 
    } 
    while(!stack.empty()){ 
      System.out.print(stack.peek()+" "); 
      stack.pop(); 
    } 

    System.out.println(); 
    for(char s : "写了个一句话倒起来说的程序".toCharArray()){//用例:正话反说 
      stack.push(String.valueOf(s)); 
    } 
    while(!stack.empty()){ 
      System.out.print(stack.peek()); 
      stack.pop(); 
    } 
  } 
}

挺有意思的,讓我想了,以前在學校的晚會上,主持人互動的時候會讓人上台去答題拿獎品,其中有一個題目就是主持人說一句話,然後要求選手倒起來說,我們的這個程序很符合需求嘛,哈哈,我們可以用java來作弊,學以致以

訊息佇列的應用場景,補充(來自互聯網)

個人認為訊息佇列的主要特點是非同步處理,主要目的是減少請求回應時間和解耦。所以主要的使用場景就是將比較耗時且不需要即時(同步)傳回結果的操作作為訊息放入訊息佇列。同時由於使用了訊息佇列,只要確保訊息格式不變,訊息的傳送者和接收者並不需要彼此聯繫,也不需要受對方的影響,也就是解耦和。

使用場景的話,舉個例子:

假設使用者在你的軟體中註冊,服務端收到使用者的註冊請求後,它會做這些動作:

校驗用戶名等信息,如果沒問題會在資料庫中添加一個用戶記錄

#如果是用郵箱註冊會給你發送一封註冊成功的郵件,手機註冊則會發送簡訊

分析用戶的個人訊息,以便將來向他推薦一些志同道合的人,或向那些人推薦他

##發送給用戶一個包含操作指南的系統通知


等等…


但是對於使用者來說,註冊功能實際上只需要第一步,只要服務端將他的帳戶資訊存到資料庫中他便可以登入上去做他想做的事情了。至於其他的事情,非要在這次請求中全部完成麼?值得用戶浪費時間等你處理這些對他來說無關緊要的事情?所以實際當第一步做完後,服務端就可以把其他的操作放入對應的訊息佇列中然後馬上回傳使用者結果,由訊息佇列非同步的進行這些操作。

或還有一種情況,同時有大量用戶註冊你的軟體,再高並發情況下註冊請求開始出現一些問題,例如郵件接口承受不住,或者是分析信息時的大量計算使cpu滿載,這將會出現雖然用戶資料記錄很快的添加到資料庫中了,但是卻卡在發送郵件或分析資訊時的情況,導致請求的響應時間大幅增長,甚至出現超時,這就有點不划算了。面對這種情況一般也是將這些操作放入訊息佇列(生產者消費者模型),訊息佇列慢慢的進行處理,同時可以很快的完成註冊請求,不會影響使用者使用其他功能。

所以在軟體的正常功能開發中,並不需要去刻意的尋找訊息佇列的使用場景,而是當出現效能瓶頸時,去查看業務邏輯是否存在可以非同步處理的耗時操作,如果存在的話便可以引入訊息佇列來解決。否則盲目的使用訊息佇列可能會增加維護和開發的成本卻無法得到可觀的效能提升,那就得不償失了。

以上是Java中訊息佇列的範例程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn