簡體   English   中英

JMS排隊方案所需的建議

[英]Advice needed for JMS Queuing Scenario

JMS排隊方案所需的建議

嗨,我是Java EE和Application Server的新手,我想知道JMS Queue(或ActiveMQ?)解決方案是否適合我的情況。 現在我認為不是,但是似乎有很多我可能不知道的選擇。

我有客戶端應用程序,可以訪問項目(數據庫中的數據)並鎖定該項目,直到客戶端完成為止。 如果客戶不關閉應用程序,則它可能會鎖定項目很多天。

我需要開發一個Web服務,該服務將發布到隊列上以在項目上完成的操作。 困難的部分是,如果此項目當前處於鎖定狀態,則需要暫停這些操作。 (而且我不知道何時釋放該鎖;因此,我可能需要一個計時器來嘗試使這些操作出隊)。

因此,如果項目A當前處於鎖定狀態,則我的隊列可能如下所示:

  1. 將數據XXX添加到項目A
  2. 將數據ZZZ添加到項目B
  3. 更新項目A的數據XXX
  4. 更新項目B的數據ZZZ
  5. 刪除項目B的數據ZZZ

如果A被鎖定,則我需要能夠繼續處理B(或任何其他未鎖定的項目)上的操作,並在釋放其鎖定時稍后再處理項目A。

我曾考慮在內存中為每個具有待處理操作以保留其順序的項目創建JMS隊列),但我不能(也不應該),因為隊列是由App Server定義的。 而且我顯然需要持久隊列(因此​​沒有臨時隊列嗎?)

JMS隊列是否適合這種情況? ActiveMQ或其他實現可以幫助嗎?

我是否需要在Timer上通過自己的Queue / SQL Table / EJB進行編碼?

對於JMS和其他方法,有很多選項。

但是,我想到了一種使用JMS(ActiveMQ或其他方式)的可能解決方案的想法:

您可能有一個用於傳入消息的JMS隊列和一個用於保留消息的隊列(等待在某個鎖定的項目上處理)。 希望您也有一些ID(我將其稱為“ projectId”,以標識鎖定的項目)。 我還假定發布項目時可以執行代碼。

這是在使用隊列實現此方案時如何思考的一些psudecode。

public void onMessage(Message msg){
   ProjData pd = extractProjectData(msg);
   if( projectLocked(pd) ) {
     msg.setStringProperty("projectId",pd.getProjectId());
     sendToOnHoldQueue(pd);
   }else{
    processProjectData(pd);
   }
}

// Say there is an event somewhere when the lock is released
public void onProjectLockReleased(projectId){
   // select messages waiting for this project via Jms selectors..

   // you may or may not want to lock the project here, while working of the "on hold events"
   MessageConsumer consumer = session.createConsumer(onHoldQueue,"projectId='"+projectId+"'");
   while(Messages msg  = consumer.receiveNoWait()){
     processProjectData(pd); 
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM