当前位置: 首页 > 知识库问答 >
问题:

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

周睿范
2023-03-14

我希望有人能帮我,因为我在这里迷路了。我正在尝试使用线程在我们的web应用程序中创建一些报告。我们的应用程序使用wildfly-10-final、postgresql、zk框架和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>

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

[服务器:集成]12:03:30071错误[org.jboss.as.ejb3.timer](EJB默认值-3)WFLYEJB020:调用计时器超时时出错:[id=3425f89c-802f-4203-b74e-b64446015242 timedObjectId=integration.kernel.RmtModule auto timer?:false persistent?:false timerService=org.jboss.as.ejb3.timerService。TimerServiceImpl@194a63bbinitialExpiration=周一至2月18日12:02:16 AST 2019 intervalDuration(毫秒)=1000 nextExpiration=周一至2月18日12:03:31 AST 2019 timerState=in\u TIMEOUT info=it。tecnositaf公司。rmt3.kernel。常见的模块。调度程序。RMTTimerConfig@55f179c7]:javax。ejb。ConcurrentAccessTimeoutException:WFLYEJB0241:RmtModule上的EJB 3.1 PFD2 4.8.5.5.1并发访问超时-无法在组织的60000毫秒[服务器:集成]内获得锁定。jboss。像ejb3.concurrency。ContainerManagedConcurrencyInterceptor。org上的processInvocation(ContainerManagedConcurrencyInterceptor.java:106)[服务器:集成]。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:集成]在org。jboss。像ejb3.组件。拦截器。ShutDownInterceptorFactory 1美元。processInvocation(ShutDownInterceptorFactory.java:64)[服务器:集成]位于org。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:集成]在org。jboss。像ee。组成部分NamespaceContextInterceptor。processInvocation(NamespaceContextInterceptor.java:50)[服务器:集成]位于org。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:集成]在org。jboss。像ejb3.component。拦截器。AdditionalSetupInterceptor。processInvocation(AdditionalSetupInterceptor.java:54)[服务器:集成]位于org。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:集成]在org。jboss。调用。ContextClassLoaderInterceptor。processInvocation(ContextClassLoaderInterceptor.java:64)[服务器:集成]位于org。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:集成]在org。jboss。调用。拦截器上下文。在组织上运行(InterceptorContext.java:356)[服务器:集成]。野蝇。安全经理WildFlySecurityManager。doChecked(WildFlySecurityManager.java:636)[服务器:集成]位于org。jboss。调用。访问检查接收器。org上的processInvocation(AccessCheckingInterceptor.java:61)[服务器:集成]。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:集成]在org。jboss。调用。拦截器上下文。在组织上运行(InterceptorContext.java:356)[服务器:集成]。jboss。调用。PrivilegedWithCombinerInterceptor。org上的processInvocation(privilegedwithcombineinterceptor.java:80)[服务器:集成]。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:集成]在org。jboss。调用。链式接收器。org上的processInvocation(ChainedInterceptor.java:61)[服务器:集成]。jboss。像ejb3.timerservice。TimedObjectInvokerImpl。组织上的callTimeout(TimedObjectInvokerImpl.java:99)[服务器:集成]。jboss。像ejb3.timerservice。TimedObjectInvokerImpl。组织上的callTimeout(TimedObjectInvokerImpl.java:109)[服务器:集成]。jboss。像ejb3.timerservice。计时器任务。org上的invokeBeanMethod(TimerTask.java:190)[服务器:集成]。jboss。像ejb3.timerservice。计时器任务。组织上的callTimeout(TimerTask.java:186)[服务器:集成]。jboss。像ejb3.timerservice。计时器任务。在组织上运行(TimerTask.java:157)[服务器:集成]。jboss。像ejb3.timerservice。TimerServiceImpl$任务$1。在组织上运行(TimerServiceImpl.java:1215)[服务器:集成]。野蝇。扩大requestcontroller。RequestController$QueuedTask$1。在java上运行(RequestController.java:497)[服务器:集成]。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1142)[服务器:集成]。util。同时发生的ThreadPoolExecutor$工作者。在java上运行(ThreadPoolExecutor.java:617)[服务器:集成]。lang.Thread。在组织上运行(Thread.java:745)[服务器:集成]。jboss。Thread。JBossThread。运行(JBossThread.java:320)

在此之后,我不断收到以下错误:

[服务器:业务]12:04:25757错误[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@3782910binitialExpiration=周一至2月18日12:02:23 AST 2019 intervalDuration(毫秒)=1000 nextExpiration=周一至2月18日12:04:26 AST 2019 timerState=RETRY\u TIMEOUT info=it。tecnositaf公司。rmt3.kernel。常见的模块。调度程序。RMTTimerConfig@2568f194]:javax。ejb。ConcurrentAccessTimeoutException:WFLYEJB0241:EJB 3.1 PFD2 4.8.5.5.1 RmtModule上的并发访问超时-无法在组织的60000毫秒[服务器:业务]内获得锁定。jboss。像ejb3.concurrency。ContainerManagedConcurrencyInterceptor。位于组织的processInvocation(ContainerManagedConcurrencyInterceptor.java:106)[服务器:业务]。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:业务]在组织中。jboss。像ejb3.组件。拦截器。ShutDownInterceptorFactory 1美元。processInvocation(ShutDownInterceptorFactory.java:64)[服务器:业务]位于org。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:业务]在组织中。jboss。像ee。组成部分NamespaceContextInterceptor。processInvocation(NamespaceContextInterceptor.java:50)[服务器:业务]位于org。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:业务]在组织中。jboss。像ejb3.组件。拦截器。AdditionalSetupInterceptor。processInvocation(AdditionalSetupInterceptor.java:54)[服务器:业务]位于org。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:业务]位于组织。jboss。调用。ContextClassLoaderInterceptor。processInvocation(ContextClassLoaderInterceptor.java:64)[服务器:业务]位于org。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:业务]在组织中。jboss。调用。拦截器上下文。在组织上运行(InterceptorContext.java:356)[服务器:business]。野蝇。安全经理WildFlySecurityManager。doChecked(WildFlySecurityManager.java:636)[服务器:业务]位于org。jboss。调用。访问检查接收器。org上的processInvocation(AccessCheckingInterceptor.java:61)[服务器:业务]。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:业务]位于组织。jboss。调用。拦截器上下文。在组织上运行(InterceptorContext.java:356)[服务器:business]。jboss。调用。PrivilegedWithCombinerInterceptor。org上的processInvocation(privilegedwithcombineinterceptor.java:80)[服务器:业务]。jboss。调用。拦截器上下文。继续(InterceptorContext.java:340)[服务器:业务]位于组织。jboss。调用。链式接收器。org上的processInvocation(ChainedInterceptor.java:61)[服务器:业务]。jboss。像ejb3.timerservice。TimedObjectInvokerImpl。callTimeout(TimedObjectInvokerImpl.java:99)[服务器:业务]位于组织。jboss。像ejb3.timerservice。TimedObjectInvokerImpl。组织上的callTimeout(TimedObjectInvokerImpl.java:109)[服务器:业务]。jboss。像ejb3.timerservice。计时器任务。org上的invokeBeanMethod(TimerTask.java:190)[服务器:业务]。jboss。像ejb3.timerservice。计时器任务。组织上的callTimeout(TimerTask.java:186)[服务器:业务]。jboss。像ejb3.timerservice。计时器任务。retryTimeout(TimerTask.java:213)[服务器:业务]位于组织。jboss。像ejb3.timerservice。计时器任务。在组织上运行(TimerTask.java:165)[服务器:业务]。jboss。像ejb3.timerservice。TimerServiceImpl$任务$1。在组织上运行(TimerServiceImpl.java:1215)[服务器:业务]。野蝇。扩大requestcontroller。RequestController$QueuedTask$1。在java上运行(RequestController.java:497)[服务器:业务]。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1142)[服务器:业务]。util。同时发生的ThreadPoolExecutor$工作者。在java上运行(ThreadPoolExecutor.java:617)[服务器:业务]。lang.Thread。在org上运行(Thread.java:745)[Server:business]。jboss。Thread。JBossThread。运行(JBossThread.java:320)

这是我第一次在wildfly和java ee容器中处理线程,所以我不知道是什么导致了这种情况。

共有1个答案

宇文鸿畴
2023-03-14

这里有一点猜测,因为我不知道wildfly是什么,但从异步servlet链接来看,似乎您可能正在使用0-permit信号量向您的任务发出结果就绪的信号。如果您的Runnable使用共享(字段,而非局部变量)信号量,则可能与为每个任务创建信号量并传递到任务中以使其成为<代码>的模式不同。从其他线程释放()。这种实现方式很可能会被破坏,例如任务线程发出错误提交线程的信号以继续并检索结果!从这里开始,它可能会崩溃,无法释放EJB并发锁。

现在,假设事实并非如此,即任务向正确的提交者发出信号,而不是信号量上阻塞的随机线程。。实际异常必须来自布尔成功=锁定。tryLock(时间,单位);如果(!success){throw EjbLogger.ROOT\u LOGGER.concurrentAccessTimeoutException(invocationContext,time unit.name());(摘自ContainerManagedConcurrencyInterceptor.java)在上述假设下,您的任务是否可能运行很长时间,因此60秒的超时时间还不够?如果您分享任务正在执行的详细信息(以及持续多长时间),可能会有所帮助。

 类似资料:
  • 问题内容: 我已经搜索了互联网的最深处,但似乎找不到答案-.- 问题出在我要编写的javaFx程序中。但是除了添加控制器类,我无能为力了。我遵循了几乎所有可以找到的教程,但是这个问题对我来说仍然是未知的。 这是例外: 这是代码。有三个类:Main.class,我使用SceneBuilder 2创建的MainUI.fxml和显然应作为mainuis控制器工作的MainUIController.cla

  • 我是Java编程的新手,我正在自学。 在运行javac时遇到一些问题后,我再次检查了windows地址和类路径,并将它们设置为正确的目录路径。问题解决了,因为现在当我输入'javac-version'时,我得到的版本显示java comilier已经安装。因此,现在我正试图从命令提示符运行一个Helloworld程序,以便检查基本功能!(我没有使用Eclipse,因为我还没有准备好增加额外的复杂性

  • 当我单击“开始”按钮时,emulator不工作。我能做什么?请帮帮我!这是错误: 我能做什么?请帮帮我! 不可预期的顶级例外:ain.run运行时异常:C:\用户\维森\\Android\Probeta\app\build\中介\类\调试:文件未找到ain.java:246FileUcom.android.dx.command.dexer.文件(FileUain.main)ain.java:215

  • 但我不知道该怎么做。我正在使用maven来获取依赖项。它是否与Apache HttpComponents的版本有关? 下面是pom.xml

  • 我是Grails的新手,我用GVM工具安装了它,并试图从终端运行一个默认应用程序,只需尝试以下命令:Grails create-app demo和Grails run-app,我得到了一个巨大的错误: 编辑:问题解决了,只需升级JDK版本。

  • 本文向大家介绍使用java的HttpClient实现多线程并发,包括了使用java的HttpClient实现多线程并发的使用技巧和注意事项,需要的朋友参考一下 说明:以下的代码基于httpclient4.5.2实现。 我们要使用java的HttpClient实现get请求抓取网页是一件比较容易实现的工作: 要多线程执行get请求时上面的方法也堪用。不过这种多线程请求是基于在每次调用get方法时创建