2014-12-29 8 views
0

순차적 HTTP 호출을 4 개의 REST 서비스로 전환하고 commonj4 작업 관리자 태스크 실행 프로그램을 사용하여 4 개의 동시 호출을 수행했습니다. WebLogic 12c를 사용하고 있습니다. 이 새로운 코드는 내 개발 환경에서 작동하지만로드 조건 하에서 테스트 환경에서, 그리고 때때로로드되지 않는 동안 결과 맵은 모든 결과로 채워지지 않습니다. 로깅은 각 작업 항목이 결과를 수신했다고 제안합니다. 이것은 ConcurrentHashMap에 문제가 될 수 있습니까? IBM의이 예제에서는 자체 클래스의 Work를 사용하고 getData() 메소드가 있지만, 클래스 메소드에는 해당 메소드가 실제로 존재하지 않는다고합니다. 나는 Work 클래스를 사용한 다른 예제를 따라 갔지만 메인 스레드로 그 스레드에서 데이터를 가져 오는 방법을 보여주지 않았다. schedule() 대신 execute()를 사용해야합니까? API는 잘 문서화되어 있지 않습니다. stuckthreadtimeout이 충분히 높습니다. component.processInbound()에는 실제로 HTTP 호출의 코드가 포함되어 있지만 아래의 클래스의 동기 버전으로 다시 전환 할 수 있고 문제가 없기 때문에 문제가 없습니다.Commonj Work Manager를 사용하여 비동기 HTTP 호출 보내기

http://publib.boulder.ibm.com/infocenter/wsdoc400/v6r0/index.jsp?topic=/com.ibm.websphere.iseries.doc/info/ae/asyncbns/concepts/casb_workmgr.html

내 코드 :

public class WorkManagerAsyncLinkedComponentRouter implements 
     MessageDispatcher<Object, Object> { 

    private List<Component<Object, Object>> components; 
    protected ConcurrentHashMap<String, Object> workItemsResultsMap; 
    protected ConcurrentHashMap<String, Exception> componentExceptionsInThreads; 
... 

    //components is populated at this point with one component for each REST call to be made. 
    public Object route(final Object message) throws RouterException { 
    ... 
     try { 
      workItemsResultsMap = new ConcurrentHashMap<String, Object>(); 
      componentExceptionsInThreads = new ConcurrentHashMap<String, Exception>(); 
      final String parentThreadID = Thread.currentThread().getName(); 

      List<WorkItem> producerWorkItems = new ArrayList<WorkItem>(); 
      for (final Component<Object, Object> component : this.components) { 
       producerWorkItems.add(workManagerTaskExecutor.schedule(new Work() { 
        public void run() { 
         //ExecuteThread th = (ExecuteThread) Thread.currentThread(); 
         //th.setName(component.getName()); 
         LOG.info("Child thread " + Thread.currentThread().getName() +" Parent thread: " + parentThreadID + " Executing work item for: " + component.getName()); 
         try { 
          Object returnObj = component.processInbound(message); 
          if (returnObj == null) 
           LOG.info("Object returned to work item is null, not adding to producer components results map, for this producer: " 
             + component.getName()); 
          else { 
           LOG.info("Added producer component thread result for: " 
             + component.getName()); 
           workItemsResultsMap.put(component.getName(), returnObj); 
          } 
          LOG.info("Finished executing work item for: " + component.getName()); 
         } catch (Exception e) { 
          componentExceptionsInThreads.put(component.getName(), e); 
         } 
        } 
... 
       })); 
      } // end loop over producer components 

      // Block until all items are done 
      workManagerTaskExecutor.waitForAll(producerWorkItems, stuckThreadTimeout); 

      LOG.info("Finished waiting for all producer component threads."); 
      if (componentExceptionsInThreads != null 
        && componentExceptionsInThreads.size() > 0) { 
       ... 
      } 
      List<Object> resultsList = new ArrayList<Object>(workItemsResultsMap.values()); 
      if (resultsList.size() == 0) 
       throw new RouterException(
         "The producer thread results are all empty. The threads were likely not created. In testing this was observed when either 1)the system was almost out of memory (Perhaps the there is not enough memory to create a new thread for each producer, for this REST request), or 2)Timeouts were reached for all producers."); 
      //** The problem is identified here. The results in the ConcurrentHashMap aren't the number expected . 
      if (workItemsResultsMap.size() != this.components.size()) { 
       StringBuilder sb = new StringBuilder(); 
       for (String str : workItemsResultsMap.keySet()) { 
        sb.append(str + " "); 
       } 
       throw new RouterException(
         "Did not receive results from all threads within the thread timeout period. Only retrieved:" 
           + sb.toString()); 
      } 
      LOG.info("Returning " + String.valueOf(resultsList.size()) + " results."); 
      LOG.debug("List of returned feeds: " + String.valueOf(resultsList)); 
      return resultsList; 

     } 
... 
    } 
} 

답변

0

나는 매개 변수로 사용되는 DOM 문서를 복제 끝났다. 매개 변수에 부작용이있는 다운 스트림 코드가 있어야합니다.