Adición de otra respuesta a la rosca, ya que he encontrado una solución para esto, finalmente.
Mi entorno: WAS 8.5.5, Quartz 1.8.5, no Spring.
El problema que tuve fue el (anteriormente indicado) hilo no administrado causando una NamingException de ctx.lookup(myJndiUrl)
, que fue en lugar trabajando correctamente en otros servidores de aplicaciones (JBoss, Weblogic); En realidad, Webpshere estaba disparando un "incidente" con el siguiente mensaje:
javax.naming.ConfigurationException: Una operación JNDI en un "java:" nombre no se puede completar porque el tiempo de ejecución del servidor no es capaz de asociar la hilo de operación con cualquier componente de aplicación J2EE. Esta condición puede ocurrir cuando el cliente JNDI que utiliza el nombre "java:" no se ejecuta en el hilo de una solicitud de aplicación de servidor. Asegúrese de que una aplicación J2EE no ejecute operaciones JNDI en nombres "java:" dentro de bloques de código estáticos o en subprocesos creados por esa aplicación J2EE. Dicho código no se ejecuta necesariamente en el hilo de una solicitud de aplicación de servidor y, por lo tanto, no es compatible con operaciones JNDI en nombres "java:".
Los siguientes pasos resolvieron el problema:
1) actualizado a 1.8.6 cuarzo (no hay cambios en el código), justo pom experto
2) añade lo siguiente a dep classpath (en mi caso, la carpeta EAR/lib), para que el nuevo WorkManagerThreadExecutor esté disponible
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-commonj</artifactId>
<version>1.8.6</version>
</dependency>
Nota: en QTZ-113 o en la Documentación oficial de Quartz 1.x2.x, no se menciona cómo activar esta solución.
3) se añade lo siguiente a quartz.properties ("WM/predeterminado" JNDI de la DefaultWorkManager ya configurada en mi WS 8.5.5, véase Recursos -> -> AsynchronousBeans WorkManagers en la consola WAS) :
org.quartz.threadExecutor.class=org.quartz.custom.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default
Nota: la clase derecha es org.quartz. personalizado .WorkManagerThreadExecutor para quartz-scheduler-1.8.6 (probado) o org.quartz. commonj .WorkManagerThreadExecutor de 2.1.1 en (no probado, pero comprobada dentro real quartz-commonj's jars en repositorios de Maven)
4) trasladaron las operaciones de búsqueda JNDI en el constructor vacío del trabajo de cuarzo (gracias a m_klovre's "Thread outside of the J2EE container"); es decir, el constructor se invocaba por reflexión (método newInstance()
) desde el mismo contexto J2EE de mi aplicación, y tenía acceso al espacio de nombres java:global
, mientras que el método execute(JobExecutionContext)
aún se ejecutaba en un contexto más pobre, al que faltaba toda mi aplicación EJBs
Espero que esto ayude.
Ps. como referencia, puede encontrar here un ejemplo del archivo quartz.properties que estaba usando anteriormente
¿Qué quiere decir por "tirar hilos no administrados"? –
Me lo informó nuestro equipo de WAS, que cuando nuestra aplicación se ejecuta hay hilos que se engendran, en un estado no manejado, que no está conectado a nada, GC no puede acceder a ellos. Según la lectura del sitio web de IBM, esto puede suceder al usar Quartz. – boyd4715