開發工作物件以平行執行程式碼
您可以平行執行工作物件,或在不同的 Java™ Platform, Enterprise Edition (Java EE) 環境定義中執行工作物件,方法是覆蓋工作物件中的程式碼。
開始之前
關於這項作業
若要平行執行程式碼,請將程式碼包裝在工作物件中。
程序
- 建立工作物件。工作物件會實作 com.ibm.websphere.asynchbeans.Work 介面。 例如,您可以建立動態訂閱主題的工作物件,且有權存取事件來源的任何元件可以隨需應變新增事件:
因此,任何具有事件來源存取權的元件都可以隨需應變新增事件,這可讓元件以更可擴充的方式訂閱主題,而不只是讓每一個用戶端訂閱者擁有自己的執行緒。 前一個範例在 WebSphere® Trader Sample 中完整探索。 如需詳細資料,請參閱文件的「範例」一節。class SampleWork implements Work { boolean released; Topic targetTopic; EventSource es; TopicConnectionFactory tcf; public SampleWork(TopicConnectionFactory tcf, EventSource es, Topic targetTopic) { released = false; this.targetTopic = targetTopic; this.es = es; this.tcf = tcf; } synchronized boolean getReleased() { return released; } public void run() { try { // setup our JMS stuff. TopicConnection tc = tcf.createConnection(); TopicSession sess = tc.createSession(false, Session.AUTOACK); tc.start(); MessageListener proxy = es.getEventTrigger(MessageListener.class, false); while(!getReleased()) { // block for up to 5 seconds. Message msg = sess.receiveMessage(5000); if(msg != null) { // fire an event when we get a message proxy.onMessage(msg); } } tc.close(); } catch (JMSException ex) { // handle the exception here throw ex; } finally { if (tc != null) { try { tc.close(); } catch (JMSExceptin ex1) { // handle exception } } } } // called when we want to stop the Work object. public synchronized void release() { released = true; } } - 判定此應用程式元件所需的工作管理員數目。
- 使用 java: comp 名稱空間中的工作管理員資源參照 (或邏輯名稱) 來查閱一或多個工作管理員。 (如需資源參照的相關資訊,請參閱「參照」主題。)
InitialContext ic = new InitialContext(); WorkManager wm = (WorkManager)ic.lookup("java:comp/env/wm/myWorkManager");工作管理員 (在本例中是 wm/myWorkManager) 的資源參照必須宣告為應用程式部署描述子中的資源參照。 - 使用工作物件作為參數來呼叫 WorkManager.startWork () 方法。例如:
Work w = new MyWork(...); WorkItem wi = wm.startWork(w);startWork () 方法可以採用 startTimeout 參數。 這會指定要啟動「工作」物件的硬性時間限制。startWork () 方法會傳回工作項目物件。 此物件是一個控點,提供從元件到目前執行中工作物件的鏈結。 - [選用] 如果您的應用程式元件需要等待其一或多個執行中工作物件完成,請呼叫 WorkManager.join () 方法。例如:
WorkItem wiA = wm.start(workA); WorkItem wiB = wm.start(workB); ArrayList l = new ArrayList(); l.add(wiA); l.add(wiB); if(wm.join(l, wm.JOIN_AND, 5000)) // block for up to 5 seconds { // both wiA and wiB finished } else { // timeout // we can check wiA.getStatus or wiB.getStatus to see which, if any, finished. }這個方法會採用您元件要等待的工作項目陣列清單,以及一個旗標,指出元件是否要等待其中一個或所有工作物件完成。 您也可以指定逾時值。 - 使用 release () 方法,以信號通知工作單元停止執行。 然後,工作單元會盡快嘗試停止執行。 一般而言,此動作是透過使用安全執行緒方法來切換旗標來完成,如下列範例所示:
Work.run () 方法可以定期檢查此變數,以檢查迴圈是否結束。public synchronized void release() { released = true; }