開發作業以平行執行程式碼
您可以將程式碼包裝在「可呼叫」或「可執行」中,然後提交或排程給管理員執行程式,以平行執行作業。
開始之前
您的管理者可以選擇性地使用管理主控台來配置至少一個工作管理員,或變更預設工作管理員的設定。
關於此作業
如果要平行執行程式碼,請將程式碼包裝在「可呼叫」或「可執行」中,並提交或排程給受管理執行程式。
程序
- 實作可呼叫或可執行的作業。
作業會實作
java.util.concurrent.Callable
介面或java.lang.Runnable
介面。 例如,您可以建立動態訂閱主題及任何元件的作業。class SampleTask implements Callable<Object> { Set<MessageListener> listeners = Collections.newSetFromMap(new ConcurrentHashMap<MessageListener, Boolean>(); Topic targetTopic; TopicConnectionFactory tcf; public SampleWork(TopicConnectionFactory tcf, Topic targetTopic) { this.targetTopic = targetTopic; this.tcf = tcf; } public void addMessageListener(MessageListener listener) { listeners.add(listener); } public Object call() throws JMSException { // setup our JMS stuff.TopicConnection tc = tcf.createConnection(); try { TopicSession sess = tc.createSession(false, Session.AUTOACK); tc.start(); while( !Thread.currentThread().isInterrupted() ) { // block for up to 5 seconds. Message msg = sess.receiveMessage(5000); if( msg != null ) for (MessageListener listener : listeners) listener.onMessage(msg); } tc.close(); } finally { if (tc != null) tc.close(); } return null; } }
因此,任何元件都可以隨需應變新增訊息接聽器,這可讓元件以更可擴充的方式訂閱主題,而不只是讓每一個用戶端訂閱者擁有自己的執行緒。
- 判定此應用程式元件所需的工作管理員數目。
- 使用
java:comp
名稱空間中的受管理執行程式、執行緒 Factory、環境定義服務資源環境參照或工作管理員資源參照 (或邏輯名稱) ,來查閱一或多個工作管理員。 (如需資源環境參照和資源參照的相關資訊,請參閱「參照」主題。)InitialContext ic = new InitialContext(); ManagedExecutorService executor = (ManagedExecutorService)ic.lookup("java:comp/env/concurrent/myWorkManager");
受管理執行程式 (在此情況下為 concurrent/myWorkManager) 的資源環境參照必須宣告為應用程式部署描述子或@Resource
註釋中的資源環境參照。 - 使用「可呼叫」或「可執行」作業實例作為參數來呼叫
ManagedExecutorService.submit()
方法。例如:Callable<Boolean> task = new MyTask(...); Future<Boolean> future = executor.submit(task);
「未來」是一個控點,提供從元件到所提交作業的鏈結。
- 選用項目: 如果您的應用程式元件需要等待其一或多個作業完成,請呼叫
Future.get()
方法。例如:Future<String> futureA = executor.submit(taskA); Future<String> futureB = executor.submit(taskB); futureA.get(5, TimeUnit.SECONDS); futureB.get(5, TimeUnit.SECONDS);
或者,使用
invokeAll()
方法來提交多個作業,並等待所有作業完成。 例如:tasks = Arrays.asList(taskA, taskB); futures = executor.invokeAll(tasks, 5, TimeUnit.SECONDS); // we can check future.isDone() to see which, if any, finished.
此方法會採用您元件想要等待所有工作物件完成的作業集合。 您也可以指定逾時值。
- 使用
Future.cancel(true)
方法來嘗試岔斷作業。請實作作業以立即回應岔斷,或嘗試儘快停止執行。