開發工作物件以平行執行程式碼

您可以平行執行工作物件,或在不同的 Java™ Platform, Enterprise Edition (Java EE) 環境定義中執行工作物件,方法是覆蓋工作物件中的程式碼。

開始之前

您的管理者必須已使用管理主控台配置至少一個工作管理員。

關於這項作業

若要平行執行程式碼,請將程式碼包裝在工作物件中。

程序

  1. 建立工作物件。
    工作物件會實作 com.ibm.websphere.asynchbeans.Work 介面。 例如,您可以建立動態訂閱主題的工作物件,且有權存取事件來源的任何元件可以隨需應變新增事件:
    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;
    	}
    }
    
    
    因此,任何具有事件來源存取權的元件都可以隨需應變新增事件,這可讓元件以更可擴充的方式訂閱主題,而不只是讓每一個用戶端訂閱者擁有自己的執行緒。 前一個範例在 WebSphere® Trader Sample 中完整探索。 如需詳細資料,請參閱文件的「範例」一節。
  2. 判定此應用程式元件所需的工作管理員數目。
  3. 使用 java: comp 名稱空間中的工作管理員資源參照 (或邏輯名稱) 來查閱一或多個工作管理員。 (如需資源參照的相關資訊,請參閱「參照」主題。)
    InitialContext ic = new InitialContext();
    WorkManager wm = (WorkManager)ic.lookup("java:comp/env/wm/myWorkManager");
    工作管理員 (在本例中是 wm/myWorkManager) 的資源參照必須宣告為應用程式部署描述子中的資源參照。
  4. 使用工作物件作為參數來呼叫 WorkManager.startWork () 方法。
    例如:
    Work w = new MyWork(...);
    WorkItem wi = wm.startWork(w);
    startWork () 方法可以採用 startTimeout 參數。 這會指定要啟動「工作」物件的硬性時間限制。
    startWork () 方法會傳回工作項目物件。 此物件是一個控點,提供從元件到目前執行中工作物件的鏈結。
  5. [選用] 如果您的應用程式元件需要等待其一或多個執行中工作物件完成,請呼叫 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.
    }
    
    這個方法會採用您元件要等待的工作項目陣列清單,以及一個旗標,指出元件是否要等待其中一個或所有工作物件完成。 您也可以指定逾時值。
  6. 使用 release () 方法,以信號通知工作單元停止執行。
    然後,工作單元會盡快嘗試停止執行。 一般而言,此動作是透過使用安全執行緒方法來切換旗標來完成,如下列範例所示:
    public synchronized void release()
    {
    	released = true;
    }
    Work.run () 方法可以定期檢查此變數,以檢查迴圈是否結束。