Transacciones y planificadores
De forma predeterminada, el planificador ejecuta una tarea en una transacción global individual. Puede utilizar la cualidad de servicio QOS_ONLYONCE o QOS_ATLEASTONCE para especificar si la tarea se ejecuta una vez como una sola unidad de trabajo o como transacciones independientes.
Comportamiento de las transacciones cuando se ejecutan tareas
Dado que, de forma predeterminada, el planificador ejecuta una tarea en una sola transacción global, la transacción está abierta hasta que la tarea se completa o falla. Los recursos relacionados con esa transacción están sujetos a tiempos de espera distintos y la hebra de la tarea se podría identificar como que se ha cerrado su comunicación si la tarea se ejecuta durante un largo período de tiempo que puede abarcar muchos minutos u horas.
QOS_ONLYONCE
- Se aplica el contexto de la aplicación que ha creado la tarea a la hebra.
- Se inicia un contexto transaccional global.
- Se calcula la hora de siguiente activación y del lugar de comienzo con el bean UserCalendar
o DefaultUserCalendar.Importante: Si utiliza el método TaskInfo.setTaskExcecutionOptions con la opción TaskInfo.EXECUTION_DELAYEDUPDATE, se producirá este paso después de actualizarse el registro.
- Se actualiza el registro de tarea de base de datos de tarea con el estado de la tarea siguiente o se suprime si ha finalizado la tarea y el valor de depuración automática de la tarea es true.
- Se actualiza el registro de base de datos de tarea con el estado de la tarea siguiente o se suprime si ha finalizado la tarea y el valor de depuración automática de la tarea es true. Si se utiliza la opción EXECUTION_DELAYEDUPDATE, la base de datos no reflejará el siguiente estado de la tarea, sino el estado actual con el estado TaskStatus.RUNNING establecido.
- Si se establece el bean NotificationSink, se activa una notificación FIRING.
- Se inicia el objeto BeanTaskInfo o MessageTaskInfo.
- Si no ha podido efectuar la tarea y está establecido el bean NotificationSink, se activa una notificación FIRE_FAILED en una transacción aparte.
- Si se ha establecido un bean NotificationSink de la tarea, entonces se activan las distintas notificaciones cuando sea necesario.
- Si se utiliza la opción EXECUTION_DELAYEDUPDATE para la tarea, se actualizará una segunda vez la base de datos con el siguiente estado de la tarea.
- Se compromete la transacción global.
- Cada recurso que participa en la transacción de la tarea debe tener
posibilidades XA de 2 fases.
Esto incluye el origen de datos JDBC (Java™ Database Connectivity) configurado para el planificador, todos los servicios JMS (Java Messaging Service) que los objetos MessageTaskInfo utilicen y todos los recursos utilizados en los bean UserCalendar, TaskHandler o NotificationSink que tengan un valor de transacción de "Required" (necesaria).
- Un recurso puede ser de una sola fase, si el soporte del último participante está habilitado para la aplicación que ha creado la transacción. Habilite el soporte del último participante mediante una herramienta de ensamblaje. También puede habilitar el soporte de último participante mediante la consola administrativa. Para obtener información detallada, consulte el tema Valores de extensión de soporte de último participante.
Todas las excepciones inesperadas se registran en el registro de actividades y todos los sucesos que participan en la transacción global de la tarea se retrotraen. Aquí se incluyen cambios en el registro de base de datos de la tarea, que obligan a que se vuelva a ejecutar la tarea cuando el daemon del planificador sondea la base de datos durante el siguiente ciclo de sondeo. Los beans UserCalendar, TaskHandler y NotificationSink pueden optar por no participar en la transacción global configurando el valor de transacción del bean en "Requires new" (Requiere nueva).
QOS_ATLEASTONCE
- Se aplica el contexto de la aplicación que ha creado la tarea a la hebra.
- El registro de base de datos de la tarea se actualiza con el estado RUNNING de la tarea.
- Se llama a los beans UserCalendar, NotificationSink.
- Se inicia BeanTaskInfo o MessageTaskInfo.
- Se envían las notificaciones de resultados.
- Se actualiza la base de datos con el siguiente estado de la tarea, si éste no ha cambiado desde que se grabó el estado RUNNING.
Si se produce una anomalía después de grabarse el estado RUNNING en la base de datos y antes de que se grabe el resultado, quizá se ejecute más de una vez la tarea.
Cuando se utiliza QOS_ATLEASTONCE, ninguno de los beans NotificationSink, UserCalendar y TaskHandler debe imponer una transacción (TX_MANDATORY), dado que no hay ninguna transacción global disponible cuando se ejecuta la tarea. Los componentes EJB utilizan transacciones gestionadas por contenedor "Required" o "Requires new" o una transacción gestionada por bean.
Comportamiento de transacciones cuando se utilizan los métodos de la API del planificador o las operaciones MBean de WASScheduler
Todos los métodos de interfaz del planificador participan en un solo contexto transaccional global. Si ya existe un contexto transaccional global en la hebra cuando se ejecutan los métodos create(), suspend(), resume(), cancel() y purge(), se utilizará la transacción global existente. De lo contrario, comenzará una transacción global nueva.
Si el método participa en la transacción global del proceso que lo llama y se produce un error inesperado, se marca la transacción como retrotraída. Si la excepción es declarada, entonces se vuelve a emitir la excepción al proceso que la llama y se deja la transacción aparte para que el proceso que la llama la comprometa o la retrotraiga.
Si el método inicia su propia transacción global y se produce una excepción, se retrotrae la transacción y se vuelve a emitir una excepción para el proceso que ha emitido la llamada.