我正在使用 ExecutorService 进行一些测试,以在 Liberty 中执行多线程。从我的测试看来,启动可以使用 JCICS API 的线程(例如创建一个新的 TSQ)的唯一方法似乎是使用静态方法
CICSExecutorService.runAsCics(task1)
如果我以另一种方式启动线程,例如:
// in this way, the OSGi should create an instance of CICSExecutorService automatically
ExecutorService cicsExecutor = Executors.newFixedThreadPool(1);
cicsExecutor .submit(task1);
线程无法使用 JCICS API;特别是我得到这个错误:
java.util.concurrent.ExecutionException: com.ibm.cics.server.CicsRuntimeException: DTCTSQ_READITEM:
No JCICS context is associated with the current thread.
这样对吗?谢谢。
最佳答案
没错,将您的可运行/可调用(task1)提交给您自己新创建的执行器将不会在支持 CICS 的线程(也不是 Liberty 管理的线程)上运行。
如果您使用的是 CICS TS v5.3 或更高版本,则有许多方法可用,您可以使用 CICSExecutorService.runAsCICS(),它经过优化以使用 Liberty 的托管执行器。您可以直接从 OSGi 服务中查找 Liberty 的受管执行器,或者您可以 @Inject 一个执行器的实例并将 Liberty concurrent-1.0 特性添加到您的 server.xml(有关详细信息,请参见后面的回答)。
如果您使用的是 v5.3 之前的版本,则 CICSExecutorService.runAsCICS() 方法可用,但它不会与 Liberty 的托管执行器集成,因此您将仅限于 JCICS 操作和 Java EE (Liberty)函数在该可运行/可调用任务中将不可用。
关于java - 在 IBM Liberty Profile 中使用 Executor Service 进行多线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64120516/