Wildfly 10:尝试实现Java并发实用程序时出错

问题描述 投票:0回答:1

我希望有人可以提供帮助,因为我迷失在这里。我正在尝试使用线程在我们的Web应用程序中创建一些报告。我们的应用程序使用wildfly-10-final,postgresql,zk框架和ejb3。我按照这个示例here来创建线程。

我在无状态服务中创建了这个函数:

@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>

从viewmodel调用此函数。在运行应用程序之前,一切似乎都很好。 - 我先得到这个错误:

[服务器:集成] 12:03:30,071错误[org.jboss.as.ejb3.timer](EJB默认值 - 3)WFLYEJB0020:调用计时器超时时出错:[id = 3425f89c-802f-4203-b74e-b64446015242 timedObjectId = integration.kernel.RmtModule auto-timer?:false persistent?:false timerService =org.jboss.as.ejb3.timerservice.TimerServiceImpl@194a63bb initialExpiration = Mon Feb 18 12:02:16 AST 2019 intervalDuration(以毫秒为单位)= 1000 nextExpiration = Mon Feb 18 12:03:31 AST 2019 timerState = IN_TIMEOUT info = it.tecnositaf.rmt3.kernel.common.modules.scheduler.RMTTimerConfig@55f179c7]:javax.ejb.ConcurrentAccessTimeoutException:WFLYEJB0241:EJB 3.1 PFD2 4.8.5.5 .1 RmtModule上的并发访问超时 - 无法在org.jboss上的org.jboss.as.ejb3.concurrency.ContainerManagedConcurrencyInterceptor.processInvocation(ContainerManagedConcurrencyInterceptor.java:106)[服务器:集成]的60000MILLISECONDS [服务器:集成]中获取锁定。 invocation.InterceptorContext.proceed(InterceptorContext.java:340)[服务器:集成] org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory $ 1.processInvocation(ShutDownInterceptorFactory.java:64)[服务器:集成]在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)[服务器:集成] at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:54)[服务器:集成]在org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)[服务器:集成] at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64)[服务器:集成] org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)[服务器:集成] org.jboss.invocation .Interceptor Context.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)[服务器:集成]在org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) [服务器:集成]在org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80)[服务器:集成]在org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)[服务器:集成] at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)[服务器:集成] org.jboss.as.ejb3.timerservice.TimedObjectInvokerImpl.callTimeout(TimedObjectInvokerImpl.java:99)[服务器:集成]在org。 jboss.as.ejb3.tim erservice.TimedObjectInvokerImpl.callTimeout(TimedObjectInvokerImpl.java:109)[服务器:集成]在org.jboss.as.ejb3.timerservice.TimerTask.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 $ 1.run(RequestController.java:497)[服务器:集成] java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[服务器:集成]在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.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@3782910b initialExpiration = Mon Feb 18 12:02:23 AST 2019 intervalDuration(以毫秒为单位)= 1000 nextExpiration = Mon Feb 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上的并发访问超时 - 无法在org.jboss下的60000MILLISECONDS [Server:business]中获取锁定org.jboss.as.ejb3.concurrency.ContainerManagedConcurrencyInterceptor.processInvocation(ContainerManagedConcurrencyInterceptor.java:106)org.jboss中的[Server:business] .invocation.InterceptorContext.proceed(InterceptorContext.java:340)[服务器:业务] at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory $ 1.processInvocation(ShutDownInterceptorFactory.java: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)[服务器:业务] at org .jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:54)[服务器:业务] org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)[服务器:业务] at org .jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64)[服务器:business] at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)[服务器:business] at org.jboss.invocation.InterceptorContext .RUN(InterceptorConte xt.java:356)[服务器:业务] org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:636)[服务器:业务] at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java: 61)[服务器:业务] org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)[服务器:业务] at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356)[服务器:业务] org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80)[服务器:business] org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)[服务器:business] at org.jboss。 invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)[服务器:business] atg.jboss.as.ejb3.timerservice.TimedObjectInvokerImpl.callTimeout(TimedObjectInvokerImpl.java:99)[服务器:business] at org.jboss.as。 ejb3.timerservice.TimedObjectInvokerImpl.callTimeout(TimedObjec tInvokerImpl.java:109)[服务器:business] at org.jboss.as.ejb3.timerservice.TimerTask.invokeBeanMethod(TimerTask.java:190)[服务器:business] at org.jboss.as.ejb3.timerservice.TimerTask。 callTimeout(TimerTask.java:186)[服务器:business] atg.jboss.as.ejb3.timerservice.TimerTask.retryTimeout(TimerTask.java:213)[服务器:business] at org.jboss.as.ejb3.timerservice。 TimerTask.run(TimerTask.java:165)[服务器:业务] at org.jboss.as.ejb3.timerservice.TimerServiceImpl $ Task $ 1.run(TimerServiceImpl.java:1215)[服务器:business] at org.wildfly.extension .requestcontroller.RequestController $ QueuedTask $ 1.run(RequestController.java:497)[Server:business] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[server:business] at java.util.concurrent。 ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[服务器:business] at java.lang.Thread.run(Thread.java:745)[服务器:business] at org.jboss.threads.JBossThread.run(JBossThread。 Java的:320)

这是我第一次处理wildfly和java ee容器中的线程,所以我不知道是什么原因造成的。

multithreading jboss wildfly ejb-3.0
1个回答
0
投票

这里有点猜测,因为我不知道wildfly是什么,但是从您的Async Servlets链接,似乎您可能正在使用0-permit信号量向您的任务发出结果已准备就绪的信号。如果您的Runnable使用共享(字段,而不是局部变量)信号量,则可能与为每个任务创建信号量并从另一个线程传递到.release()d的任务的模式不同。实现它的这种方式可能会被打破,例如任务线程发信号错误的提交者线程继续并检索结果!从这里它可能会爆炸并且无法释放EJB并发锁。

现在,假设事实并非如此,即任务发出正确的提交者信号,而不是信号量上阻塞的随机线程。实际异常必须来自boolean success = lock.tryLock(time, unit); if (!success) { throw EjbLogger.ROOT_LOGGER.concurrentAccessTimeoutException(invocationContext, time + unit.name());(摘自ContainerManagedConcurrencyInterceptor.java),假设如上,我的任务可能是长期运行的所以60秒超时是不够的?如果您分享任务正在执行的详细信息(以及持续时间),则可能有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.