2010-12-03 12 views
8

Nuestros registros informan ThreadAbortException s que detienen nuestros trabajos de Quartz.NET en intervalos aparentemente aleatorios. Por lo que entiendo, esto normalmente no sería causado por algo que está haciendo el hilo (por ejemplo, leer un archivo de un servidor FTP, o ejecutar una consulta LINQ a Entidades), sino más bien porque algún proceso externo le está diciendo al hilo que se detenga. . Además, la forma en que se crean los registros me lleva a creer que toda la aplicación web se reinicia cuando obtenemos estos errores, así que supongo que el proceso de reinicio es lo que está causando que el hilo sea abortado en primer lugar.¿Cómo puedo averiguar por qué se detiene mi hilo en ASP.NET?

Entonces mi pregunta es: ¿cómo puedo averiguar por qué se reinicia el servidor/la aplicación? ¿Hay registros en alguna parte que me den detalles sobre cada reinicio? ¿Hay causas comunes para algo como esto que deba investigar?

Gracias de antemano por su ayuda.

Editar

acabo de tener una discusión con algunos compañeros de trabajo, y suena como IIS pone automáticamente la aplicación a dormir después de un cierto periodo de inactividad, lo que podría ser parte del problema. Con algunas investigaciones, encontré una configuración de "Tiempo de inactividad" para subprocesos de trabajo en IIS. Creo que cuando la aplicación no ha procesado ninguna solicitud por una cierta cantidad de tiempo, emite un comando de apagado. Por alguna razón, Quartz no se apaga inmediatamente, sino que espera a que se despida el siguiente trabajo, y luego el sistema detecta el hilo del trabajo y lo mata mientras intenta ejecutarlo.

Así que supongo que tenemos que encontrar alguna manera de terminar grácilmente cualquier trabajo en ejecución cuando el sistema se apaga, y hacer que Quartz realmente se apague cuando se lo indique, si no está ejecutando ningún trabajo. ¿Alguien tiene alguna experiencia con este tipo de problema?

+0

¿Está perfrming alguna Response.Redirects en su código? –

+0

No, esto no sucede durante una solicitud. Está sucediendo como parte de un trabajo de Quartz. – StriplingWarrior

+0

Hi StriplingWarrior, Estamos teniendo exactamente los mismos problemas que usted describe. Cuando ApplicationPool recicla los trabajos de .net de cuarzo, reciben una ThreadAbortException y después del segundo reciclado, los trabajos de cuarzo .net ya no se ejecutan. ¿Alguna vez resolvió los problemas? Si es así, le agradecería si pudiera describir brevemente cómo. Gracias de antemano, Enric –

Respuesta

4

Como señaló liho1eye, el problema surgió cuando el grupo de aplicaciones cerró nuestra aplicación. Por alguna razón, Quartz aparentemente no estaba cerrando inmediatamente.En cambio, esperó hasta que se ejecutara el siguiente trabajo y luego se apagara, lo que significaba que el trabajo en ejecución debía cerrarse a través de ThreadAbordException.

Nuestra solución a esto fue doble. Primero, actualizamos Quartz a una versión más reciente, lo que pareció hacer que se comportara un poco mejor. Segundo, en nuestro método Application_End en Global.asax.cs, agregamos una llamada al Scheduler.Shutdown(true). Esto le dice al programador que deje de disparar activadores adicionales, y luego espera hasta que se completen todos los desencadenadores que se ejecutan actualmente antes de permitir que termine la aplicación.

+0

¿Por qué no deshabilitó el tiempo de inactividad en iis? –

+0

@Bongo Sharp: estamos ejecutando varias aplicaciones web desde la misma máquina, con diferentes cantidades de uso. Por lo tanto, es útil permitir el reciclaje del grupo de aplicaciones. – StriplingWarrior

1

Si realiza alguna redirección en su código sin especificar el parámetro endReponse de Response.Redirect, la redirección llamará a thread.Abort(), pero todavía habrá código para ejecutar. Este código queda huérfano porque el hilo se ha ido y obtienes la excepción. Para la lectura:

http://www.c6software.com/articles/ThreadAbortException.aspx

Editar:
Otra posibilidad sería una excepción no controlada nivel de servidor que causes the w3wp.exe process to crash or recycle itself. Esta sería la causa externa a la que aludió que provocaría la interrupción del hilo, pero intentaría continuar ejecutando el código. Para determinar si este podría ser el caso, tendría excepciones en su registro de eventos del sistema. Son muy genéricos, pero claramente enumerarán w3wp.exe (para que pueda usar eso como filtro). Si este es el caso, deberá instalar el IIS Debug Diagnostics y configurar algunos monitores para detectar lo que está sucediendo en el momento del accidente. Como ocurre fuera del ciclo de vida real de la página, se pasa por alto el manejo normal de excepciones.

+0

Esto solo abortará un hilo de solicitud. Mis interrupciones se llevan a cabo en un hilo de Quartz.NET. – StriplingWarrior

+0

@StriplingWarrior - Tengo una idea diferente. Proporcionaré una edición. –

1

Naturalmente, esto significa que algo en algún lugar se llama Thread.Abort() en la instancia de la secuencia de trabajo. Me gustaría ver esta cosa de Quartz para una explicación.

Otra posibilidad es que su hilo de trabajo sea un hilo de fondo y su grupo de aplicaciones esté siendo reciclado, pero yo sabría algo sobre esta cosa de Quartz para estar seguro.

+0

Quartz es solo un programador de trabajos que ejecuta trabajos específicos en subprocesos de fondo en un horario. – StriplingWarrior

+1

¿Corre dentro de su grupo de aplicaciones web? Bueno, entonces está su problema: reciclar el grupo de aplicaciones. –

Cuestiones relacionadas