CICSCallable线程没有结束

时间:2020-11-02 09:10:22

标签: java multithreading executorservice websphere-liberty cics

我有一个Java应用程序,它将在IBM Liberty应用程序服务器上运行;我正在尝试对CICSExecutorService使用多线程。这是我的用例:

  1. 创建CICSExecutorService的实例;
  2. 从实现CICSTransactionCallable的类创建线程(对Db2进行简单的选择查询);
  3. 将线程提交给执行者服务;
  4. 关闭执行程序服务并等待终止;

这是代码:

    CICSExecutorService cicsExecutorService = new CICSExecutorService();
    //CICSReadingJob is the class that implements CICSTransactionCallable interface
    CICSReadingJob<String> thread1 = new CICSReadingJob<>();
    Future<List<String>> future1 = cicsExecutorService.submit(thread1);

    cicsExecutorService.shutdown();
    cicsExecutorService.awaitTermination(100, TimeUnit.SECONDS);

我已经使用标准的Java executor服务进行了一些简单的本地测试,其行为是,在调用shutdown和awaitTermination方法之后,程序将等待线程终止(除非线程的执行要花费100秒以上,指定的超时),然后执行继续。问题是,当我使用上面的代码时,我看到了不同的行为:实际上,即使线程(唯一与awaitTermination连接的线程,该程序也仍然停留在CICSExecutorService行上100秒。 )之前(到达call()方法的结尾)之前结束。我也尝试使用静态方法CICSExecutorService.runAsCICS()而不是cicsExecutorService.submit(),但得到的结果相同。子线程似乎在到达call()方法的末尾时仍然保持活动状态,因此,awaitTermination一直等待到超时结束。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

CICS已在内部提供CICSExecutorService实例。可直接从静态API方法(如runAsCICS()方法)访问它。您不会(也不应)尝试构造ExecutorService或自己控制ExecutorService -这都是在内部完成的,以确保观察到正确的环境和生命周期。该类上有一个公共构造函数,纯粹是为了满足声明式服务的要求,而不是一般用途。看来Javadoc应该更明确地说明其预期用途-我看看是否可以进行更新。

此页面提供了有关如何使用API​​的更多详细信息(尽管适用于Runnable而非Callable,但API遵循相同的模式): https://www.ibm.com/support/knowledgecenter/SSGMCP_5.5.0/applications/developing/java/dfhpjgo.html

请注意,您正在向执行程序提交“可调用”而不是线程。 CICSExecutorService将在后台决定在启用“ CICS”的线程上运行可调用对象-允许在内部进行线程池和重用以及其他此类智能功能。

此外,如果您正在驱动CICS Liberty应用程序,则通常不需要自己生成新的启用CICS的线程-该应用程序将隐式处理多个并发请求(通常是Web请求)。

从代码片段中,我无法确定您的应用程序试图实现什么,但是您提交的Callable对象应该将其call()方法驱动完成,届时CICS任务将结束,并且该线程位于它运行后将返回到ExecutorService的线程池。该线程将在该池中保持休眠状态,但不再与CICS事务关联(准备由另一个事务重用)。因此,如果您明确地尝试确定线程是否已终止,那么您将感到失望,因为在禁用JVM服务器之前,它们不打算在Liberty环境中终止。

通常,在使用runAsCICS()方法时,您将提交Callable并获取Future对象。然后,使用该Future对象来确定提交的工作何时完成。您不应尝试直接等待或操纵ExecutorService。

希望对您有所帮助,但是如果您仍然遇到问题,请发布更多测试应用程序并描述您要达到的目标,以便我们提供更好的指导。谢谢。

答案 1 :(得分:0)

如果您要启动一堆子线程作为CICS任务并等待直到所有子线程终止,则也可以使用CICS Async API来完成。它还具有一个JCICS界面,并且在CICSDev GitHub

上有一组示例。