#java #executorservice #websphere-liberty #cics
#java #executorservice #websphere-liberty #cics
Вопрос:
Я провожу несколько тестов с использованием 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);
потоку не удалось использовать API JCICS; в частности, я получаю эту ошибку:
java.util.concurrent.ExecutionException: com.ibm.cics.server.CicsRuntimeException: DTCTSQ_READITEM:
No JCICS context is associated with the current thread.
Это правильно? Спасибо.
Ответ №1:
Правильно, отправка вашего runnable / callable (task1) вашему собственному недавно созданному исполнителю не будет выполняться в потоке с поддержкой CICS (или в потоке, управляемом Liberty).
Если вы используете CICS TS версии 5.3 или более поздней, тогда доступно несколько методов, вы можете использовать CICSExecutorService.runAsCICS(), который оптимизирован для использования управляемого исполнителя Liberty. Вы можете напрямую найти управляемого исполнителя Liberty из служб OSGi или @Внедрить экземпляр исполнителя и добавить функцию Liberty concurrent-1.0 в свой server.xml (подробности см. в более позднем ответе).
Если вы используете версию до версии 5.3, тогда доступен метод CICSExecutorService.runAsCICS(), но он не будет интегрироваться с управляемым исполнителем Liberty, и поэтому вы будете ограничены только операциями JCICS, а функция Java EE (Liberty) не будет доступна в этой выполняемой / вызываемой задаче.
Комментарии:
1. Обновленный ответ с информацией о выпуске CICS.
Ответ №2:
Хитрость заключается в использовании управляемого исполнителя (т. Е. ManagedExecutorService
), Который позволит работе, которую вы ему отправляете, выполняться в потоках Liberty, в отличие от использования неуправляемого исполнителя (например Executors.newFixedThreadPool(1)
), который будет выполнять работу в неуправляемых потоках, у которых нет необходимого контекста для выполнения операции.
Для получения ManagedExecutorService
вам необходимо:
-
Включите эту
concurrent-1.0
функцию в своем server.xml -
Введите или найдите исполнителя, выполнив:
@Inject
ManagedExecutorService exec;
// or
// NOTE: This also requires the jndi-1.0 feature to be enabled
ManagedExecutorService exec = InitialContext.doLookup("java:comp/ManagedExecutorService");