JBoss 7.1.0:executor.submit()如何调试(无异常,但任务未启动)

时间:2018-11-26 16:41:50

标签: jboss submit executorservice

我在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的任何建议?

谢谢。

1 个答案:

答案 0 :(得分:0)

在这种特殊情况下,问题是在TEST环境中只允许运行我们已经在运行的两个线程(这是我没有意识到的应用程序的某些完全不同的部分)。因此,现在可以通过将ManagerExecutorService中的“核心线程”参数设置为更高的值来解决问题,任务正在运行。

但是,棘手的是,JBoss服务器之间没有明显的可见差异(我比较了standalone.xml配置...),只是因为JBoss中的ManagerExecutorService具有一些实际(空白)值,而这些值实际上取决于系统配置(在我的情况下为v-CPU内核)。因此,尽管配置相同,但“ TEST”中的“核心线程”似乎默认为2,而我的DEV上的值更高(我不知道)。

因此,如果比较两个环境,切勿依赖ManagerExecutorService中的默认设置。

我也重写了逻辑,而不是使用循环中的Future.get()和超时来阻止Future.get()或在循环中检查Future.isDone(),并在异常处理程序中决定是否继续等待或失败。