Wildfly 10: Ошибка при попытке реализовать утилиты параллелизма Java - PullRequest
0 голосов
/ 18 февраля 2019

Я надеюсь, что кто-то может помочь, потому что я здесь потерян.Я пытаюсь использовать темы для создания отчетов в нашем веб-приложении.Наше приложение использует wildfly-10-final, postgresql, zk framework и ejb3.Я следовал этому примеру здесь , чтобы создать темы.

Я создал эту функцию в службе без сохранения состояния:

@Override
public void runTask(Runnable task){
    executorService.execute(task);
    try {
        semaphore.tryAcquire(20, TimeUnit.MINUTES);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Я использую эту строку для вызова ManagedExecutorService:

@Resource
private ManagedExecutorService executorService;

Который имеет эту конфигурацию в domain-clustered.xml :

<managed-executor-services>
<managed-executor-service name="default" jndi-name="java:jboss/ee/concurrency/executor/default" context-service="default" hung-task-threshold="60000" keepalive-time="5000"/>
</managed-executor-services>

Эта функция вызывается из модели представления.Все вроде нормально, пока я не запустил приложение. - Сначала я получаю эту ошибку:

[Сервер: интеграция] 12: 03: 30,071 ОШИБКА [org.jboss.as.ejb3.timer] (EJB по умолчанию - 3)WFLYEJB0020: Ошибка при вызове тайм-аута для таймера: [id = 3425f89c-802f-4203-b74e-b64446015242 timedObjectId = интеграции.kernel.RmtModule автоматический таймер?: Неверный постоянный?: Ложный timerService = org.jboss.as.ejbImpererserserser@ 194a63bb initialExpiration = Пн 18 февраля 12:02:16 AST 2019 intervalDuration (в миллисекундах) = 1000 nextExpiration = Пн 18 февраля 12:03:31 AST 2019 timerState = IN_TIMEOUT info = it.tecnositaf.rmt3.kernel.common.modules«concurrency.ContainerManagedConcurrencyInterceptor.processInvocation (ContainerManagedConcurrencyInterceptor.java:106) [Сервер: интеграция] в org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340) [Сервер: интеграция] в org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory $ 1.processInvocation (ShutDownInterceptorFactory.java:64) [Сервер: интеграция] в org.jboss.in.InterceptorContext.proceed (InterceptorContext.java:340) [Сервер: интеграция] в org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation (NamespaceContextInterceptor.java:50) [Сервер: интеграция] в org.jbossInororv.proceed (InterceptorContext.java:340) [Сервер: интеграция] в org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation (AdditionalSetupInterceptor.java:54) [Сервер: интеграция] в org.jboss.invocor.Incept.proceed (InterceptorContext.java:340) [Сервер: интеграция] в org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation (ContextClassLoaderInterceptor.java:64) [Сервер: интеграция] в org.jboss.invocation.Inavaceptortej (Interceptor).: 340) [Сервер: интеграция] в org.jboss.invocation.InterceptorContext.run (InterceptorContext.java:356) [Сервер: интеграция] в org.wildfly.security.manager.WildFlySecurityManager.doChecked (WildFlySecurityManager.java:636) [Сервер:интеграция] в org.jboss.invocation.AccessCheckingInterceptor.processInvocation (AccessCheckingInterceptor.java:61) [Сервер: интеграция] в org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340) [Сервер: интеграция] в или.invocation.InterceptorContext.run (InterceptorContext.java:356) [Сервер: интеграция] в org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation (PrivilegedWithCombinerInterceptor.java:80) [ссылка на сервер: интеграция по объекту](InterceptorContext.java:340) [Сервер: интеграция] в org.jboss.invocation.ChainedInterceptor.processInvocation (ChainedInterceptor.java:61) [Сервер: интеграция] в org.jboss.as.ejb3.timerservice.TimedObjectInvokerIjectbject.vlmpl.java:99) [Сервер: интеграция] в org.jboss.as.ejb3.timerservice.TimedObjectInvokerImpl.callTimeout (TimedObjectInvokerImpl.java:109) [Сервер: интеграция] в org.jboss.as.ejb3.timerservice.TimeT.invokeBeanMethod (TimerTask.java:190)[Сервер: интеграция] в org.jboss.as.ejb3.timerservice.TimerTask.callTimeout (TimerTask.java:186) [Сервер: интеграция] в org.jboss.as.ejb3.timerservice.TimerTask.run (TimerTask.java:157) [Сервер: интеграция] в org.jboss.as.ejb3.timerservice.TimerServiceImpl $ Task $ 1.run (TimerServiceImpl.java:1215) [Сервер: интеграция] в org.wildfly.extension.requestcontroller.RequestController $ QueuedTask $.run (RequestController.java:497) [Сервер: интеграция] в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) [Сервер: интеграция] в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPool.java: 617) [Сервер: интеграция] в java.lang.Thread.run (Thread.java:745) [Сервер: интеграция] в org.jboss.threads.JBossThread.run (JBossThread.java:320)

После этого я получаю эту ошибку:

[Сервер: бизнес] 12: 04: 25,757 ОШИБКА [org.jboss.as.ejb3.timer](EJB по умолчанию - 50) WFLYEJB0022: Ошибка во время повторной попытки таймера: [id = 9e890d13-77fa-4135-a0d8-41c1c5318800 timedObjectId = business.kernel.RmtModule auto-timer?: false persistent?: false timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@3782910b02:23 AST 2019 intervalDuration (в миллисекундах) = 1000 nextExpiration = Пн 18 февраля 12:04:26 AST 2019 timerState = RETRY_TIMEOUT info=it.tecnositaf.rmt3.kernel.common.modules.scheduler.RMTTimerConfig@2568f194]: javax.ejb.ConcurrentAccessTimeoutException: WFLYEJB0241: EJB 3.1 PFD2 4.8.5.5.1 тайм-аут параллельного доступа к RmtModule - не удалось получить блокировку в пределах 60000MILLISECONDS [Server: business] в org.jboss.as.ejb3.conjurcencedMateConceptorMacContainerManagerMC: 106) [Сервер: бизнес] в org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340) [Сервер: бизнес] в org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory $ 1.processInvocteror.Ява: 64) [Сервер: Business] at org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340) [Сервер: бизнес] в org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation (NamespaceContextInterceptor.java:50)в org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340) [Сервер: бизнес] в org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation (AdditionalSetupInterceptor.java:54)в org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340) [Server: business] в org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation (ContextClassLoaderInterceptor.java:64) или в бизнес-центре [сервер]: бизнес].InterceptorContext.proceed (InterceptorContext.java:340) [Сервер: бизнес] в org.jboss.invocation.InterceptorContext.run (InterceptorContext.java:356) [Сервер: бизнес] в org.wildfly.security.manager.WildFlySdourityMan(WildFlySecurityManager.java:636) [Сервер:business] at org.jboss.invocation.AccessCheckingInterceptor.processInvocation (AccessCheckingInterceptor.java:61) [Сервер: бизнес] в org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340) [Сервер: бизнес] в или.invocation.InterceptorContext.run (InterceptorContext.java:356) [Сервер: бизнес] по адресу org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation (PrivilegedWithCombinerInterceptor.java:80) [серверная деятельность].(InterceptorContext.java:340) [Сервер: бизнес] на org.jboss.invocation.ChainedInterceptor.processInvocation (ChainedInterceptor.java:61) [Сервер: бизнес] на org.jboss.as.ejb3.timerservice.TimedObjectInvokerImpl.java: 99)[Сервер: бизнес] по адресу org.jboss.as.ejb3.timerservice.TimedObjectInvokerImpl.callTimeout (TimedObjectInvokerImpl.java:109) [Сервер: бизнес] по адресу org.jboss.as.ejb3.timerservice.TimerTask.intoke.an190) [Сервер: бизнес] в org.jboss.as.ejb3.timerservice.TimerTask.callTimeout (TimerTask.java:186) [Сервер: бизнес] в org.jboss.as.ejb3.timerservice.TimerTask.retryTimeout (TimerTask.Java: 213) [Сервер: бизнес] на org.jboss.as.ejb3.timerservice.TimerTask.run (TimerTask.java:165) [Сервер: бизнес] на org.jboss.as.ejb3.timerservice.TimerServiceImpl $ Задача $ 1.run (TimerServiceImpl.java:1215) [Сервер: бизнес] в org.wildfly.extension.requestcontroller.RequestController $ QueuedTask $ 1.run (RequestController.java:497) [Сервер: бизнес] в java.util.concurrent.ThreadPol.runWorker (ThreadPoolExecutor.java:1142) [Сервер: бизнес] в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) [Сервер: бизнес] в java.lang.Thread.run (Thread.java:745) [Сервер: business] at org.jboss.threads.JBossThread.run (JBossThread.java:320)

Я впервые работаю с потоками в wildfly и в контейнере java ee, поэтому японятия не имею, что может быть причиной этого.

1 Ответ

0 голосов
/ 18 февраля 2019

Здесь я немного догадываюсь, так как я не знаю, что такое wildfly, но из вашей ссылки на Async Servlets вы, возможно, используете семафор с 0 разрешениями, чтобы сигнализировать вашей задаче, что результаты готовы.Если ваш Runnable использует общий семафор (поле, а не локальная переменная), вероятно, это , а не тот же шаблон, в котором семафор создается для каждой задачи и передается в задачу как .release() d из другого потока.,Этот способ его реализации вполне может быть нарушен, например, потоки задач сигнализируют о неправильных потоках отправителя, чтобы продолжить и получить результаты!Отсюда он может взорваться и не сможет освободить блокировки параллелизма EJB.

Теперь, при условии, что это на самом деле не тот случай, т. Е. Задачи сигнализируют о правильном отправителе, а не о блокированном случайном потоке.на семафоре .. Фактическое исключение должно исходить от boolean success = lock.tryLock(time, unit); if (!success) { throw EjbLogger.ROOT_LOGGER.concurrentAccessTimeoutException(invocationContext, time + unit.name()); (выдержка из ContainerManagedConcurrencyInterceptor.java) в предположении выше, возможно, ваши задачи выполняются долго, поэтому 60-секундного таймаута недостаточно?Если вы поделитесь подробностями о том, что делают задачи (и как долго), это может помочь.

...