Время ожидания сокета JBoss 6 для результата метода @Asynchronous - PullRequest
2 голосов
/ 02 января 2012

У меня есть сессионный компонент EJB-3.1 без сохранения состояния, содержащий асинхронный метод, который выполняет дорогостоящую обработку и возвращает клиенту будущее, тем самым позволяя ему отображать результат обработки, как только он будет готов:

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

Этот компонент работает на экземпляре JBoss 6 и вызывается удаленно из клиента Swing:

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 секунд.

Для этих вычислений тайм-аут сокета JBoss приводит к тому, что клиент получает исключение ExecutionException вместо результата вычисления при вызове termination.get ():

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 не предоставляет никаких параметров конфигурации.

У меня вопрос, как я могу увеличить время ожидания сокета связи клиент-сервер и, если это возможно, только для соединения, установленного во время вызова асинхронного метода.

Спасибо, Томас

1 Ответ

1 голос
/ 06 января 2012

Ссылка, опубликованная Наяном Вадекаром, указала в правильном направлении.Компонентом, отвечающим за управление сокетами в JBoss AS, является JBoss remoting , который предоставляет так называемые соединители для вызова подходящих обработчиков вызовов для подключающихся транспортов.

В случае метода EJBвызовом ответственного соединителя является DefaultEjb3Connector, параметры которого можно настроить в файле ejb3-connectors-jboss-beans.xml в папке развертывания, например, в

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

, если используется профиль по умолчанию.

Повышение параметра времени ожидания после того, как URL сокета оказался эффективным.

<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, я не уверен, возможно ли на самом деле добавление адаптированного соединителя только для определенных сессионных компонентов.

...