2012-01-02 5 views
2

값 비싼 처리를 수행하고 클라이언트에게 미래를 반환하는 비동기 메서드가 포함 된 상태 비 저장 EJB-3.1 세션 Bean을 사용하므로 준비가 완료되면 처리 결과를 표시 할 수 있습니다. :@Asynchronous 메서드 결과를 기다리는 JBoss 6 소켓 제한 시간

@Asynchronous 
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
public Future<String> importModules() { 
    String result = doSomeHeavyStuff(); 
    return new AsyncResult<String>(result); 
} 

이 빈은 보스 6 인스턴스에서 실행하고 스윙 클라이언트에서 원격 호출 : 처리가 일반적으로 성공적으로 완료하는 동안

final Future<String> termination = 
      Proxy.getProxy().getMenfpImportService().importModules(); 

SwingWorker<String, Object> worker = new SwingWorker<String, Object>() { 

    @Override 
    protected String doInBackground() { 
     /* ... */ 
     if (termination.isDone()) { 
      return termination.get(); 
     } 
     /* ... */ 
    } 

    /* ... */ 
} 

, 어떤 계산을 완료하는 데 이상 300 초 정도 걸릴.

10:26:16,301  INFO Application:1150 - Execution exception during modules import: 
java.util.concurrent.ExecutionException: org.jboss.remoting.InvocationFailureException: Socket timed out. Waited 300000 milliseconds for response while calling on InvokerLocator [socket://degotte:3873/?timeout=300000]; nested exception is: 
java.net.SocketTimeoutException: Read timed out 
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222) 
at java.util.concurrent.FutureTask.get(FutureTask.java:83) 
at org.jboss.ejb3.async.spi.AsynchronousClientFuture.get(AsynchronousClientFuture.java:113) 
at org.jboss.ejb3.async.impl.util.concurrent.LocalJvmSerializableFutureWrapper.get(LocalJvmSerializableFutureWrapper.java:161) 
at lu.lippmann.forminitiale.client.gui.Application$2.doInBackground(Application.java:1137) 
at lu.lippmann.forminitiale.client.gui.Application$2.doInBackground(Application.java:1) 
at javax.swing.SwingWorker$1.call(SwingWorker.java:277) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
at javax.swing.SwingWorker.run(SwingWorker.java:316) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662) 

불행하게도, @Asynchronous 주석이 어떤 정보를 제공하지 않습니다 이러한 계산에

는 JBoss의 소켓 타임 아웃 termination.get()를 호출 할 때 계산 결과 대신 ExecutionException를받을 클라이언트의 원인 구성 옵션.

제 질문은 클라이언트 서버 통신 소켓 시간 초과를 늘릴 수있는 방법과 비동기 메서드 호출 중에 설정된 연결에 대해서만 가능한 경우에 관한 질문입니다.

덕분에, Nayan Wadekar에 의해 게시 토마스

+0

JBoss 소켓 시간 초과 구성에 대해서는 http://docs.jboss.org/jbossremoting/docs/guide/2.5/html/chapter-configuration.html을 참조하십시오. –

+0

감사합니다. 이미 도움이되었습니다. 적어도 그것은 위의 예제에서 ExecutionExceptions를 제거하는 소켓 타임 아웃을 전체적으로 증가시킬 수 있습니다. – tzangerl

답변

1

링크는 올바른 방향으로 지적했다. JBoss AS상의 소켓을 관리하는 구성 요소는 연결 전송에 적합한 호출 핸들러를 호출하는 커넥터를 제공하는 JBoss remoting입니다.

EJB 메소드 호출의 경우 담당 커넥터는 배포 폴더의 ejb3-connectors-jboss-beans.xml 파일에서 매개 변수를 구성 할 수있는 DefaultEjb3Connector 인 것처럼 보입니다.

$JBOSS_HOME/server/default/deploy/ejb3-connectors-jboss-beans.xml 

기본 프로필을 사용하는 경우.

소켓 URL이 유효한 것으로 판명 된 후 timeout 매개 변수를 높입니다.

<bean name="org.jboss.ejb3.RemotingConnector" 
class="org.jboss.remoting.transport.Connector"> 

<property name="invokerLocator"> 

    <value-factory bean="ServiceBindingManager" 
    method="getStringBinding"> 
    <parameter> 
     jboss.remoting:type=Connector,name=DefaultEjb3Connector,handler=ejb3 
    </parameter> 
    <parameter> 
     <null /> 
    </parameter> 
    <!-- <parameter>socket://${hostforurl}:${port}?timeout=300000</parameter> --> 
    <parameter>socket://${hostforurl}:${port}?timeout=1200000</parameter> 
    <parameter> 
     <null /> 
    </parameter> 
    <parameter>3873</parameter> 
    </value-factory> 

</property> 
<property name="serverConfiguration"> 
    <inject bean="ServerConfiguration" /> 
</property> 

그러나이 모든 EJB 메소드 호출에 대한 시간 제한을 일으킨다. JBoss 리모팅의 개념에 대해 읽은 것을 감안할 때 특정 세션 빈에 대해 적응 형 커넥터를 추가하는 것이 실제로 가능한지 여부는 확실하지 않습니다.