IBM Liberty Profile中的具有Executor Service的多线程

问题描述

我正在使用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. 

对吗?谢谢。

解决方法

是正确的,将您的可运行/可调用(任务1)提交给自己新创建的执行器将不会在具有CICS功能的线程(也没有Liberty托管线程)上运行。

如果您使用的是CICS TS v5.3或更高版本,则可以使用多种方法,可以使用CICSExecutorService.runAsCICS(),该方法经过优化以使用Liberty的Managed Executor。您可以直接从OSGi服务中查找Liberty的Managed Executor,也可以@Inject插入Executor的一个实例,然后将Liberty parallel-1.0功能添加到server.xml中(有关详细信息,请参阅后面的答案)。

如果您使用的是v5.3之前的版本,则可以使用CICSExecutorService.runAsCICS()方法,但该方法不会与Liberty的Managed Executor集成,因此您将只能使用JCICS操作和Java EE(Liberty)该功能在该可运行/可调用任务中将不可用。

,

诀窍是使用托管执行器(即ManagedExecutorService),它允许您提交给它的工作在Liberty线程上运行,而不是使用非托管执行器(例如Executors.newFixedThreadPool(1)),将在没有必要上下文来执行操作的非托管线程上运行工作。

要获取ManagedExecutorService,您需要:

  1. 在server.xml中启用concurrent-1.0功能

  2. 通过执行以下操作来注入或查找执行程序:

@Inject
ManagedExecutorService exec;

// or

// NOTE: This also requires the jndi-1.0 feature to be enabled
ManagedExecutorService exec = InitialContext.doLookup("java:comp/ManagedExecutorService");

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...