我在JBoss EAP 7.1.0 GA上有问题。在一个服务器(我的DEV)上,这就像一个超级按钮,而在另一个服务器(测试环境)上,使用executor.submit()执行的Callable似乎没有启动(我在日志中看不到“ This is call”消息) ,但没有给出异常或任何其他线索。
问题是-我应该在哪里/应该如何调试此问题?
呼叫代码:
@Resource(name = "DefaultManagedExecutorService")
ManagedExecutorService executor;
try {
DownloadPlayers dp = new DownloadPlayers();
Future<Queue<PlayerForDownload>> f = executor.submit(dp);
Queue<PlayerForDownload> q = f.get();
L.info(q.size());
} catch (Exception e) {
L.error("EXCEPTION" + e.getMessage());
}
它调用的类:
public class DownloadPlayers implements Callable<Queue<PlayerForDownload>> {
// the constructor gets called, I'm sure as it writes to log
// the call is as simple as this
@Override
public Queue<PlayerForDownload> call() {
L.info("This is call()");
try {
return this.getPlayersForDownload();
} catch (WorkerException e) {
L.error(e);
return null;
}
}
}
如上所述,代码本身似乎可以使用,因为它可以在一台服务器上工作,但不能在另一台服务器上工作。两者都是 7.1.0GA独立版。 关于如何调试ManagedExecutorService的任何建议?
谢谢。
答案 0 :(得分:0)
在这种特殊情况下,问题是在TEST环境中只允许运行我们已经在运行的两个线程(这是我没有意识到的应用程序的某些完全不同的部分)。因此,现在可以通过将ManagerExecutorService中的“核心线程”参数设置为更高的值来解决问题,任务正在运行。
但是,棘手的是,JBoss服务器之间没有明显的可见差异(我比较了standalone.xml配置...),只是因为JBoss中的ManagerExecutorService具有一些实际(空白)值,而这些值实际上取决于系统配置(在我的情况下为v-CPU内核)。因此,尽管配置相同,但“ TEST”中的“核心线程”似乎默认为2,而我的DEV上的值更高(我不知道)。
因此,如果比较两个环境,切勿依赖ManagerExecutorService中的默认设置。
我也重写了逻辑,而不是使用循环中的Future.get()和超时来阻止Future.get()或在循环中检查Future.isDone(),并在异常处理程序中决定是否继续等待或失败。