2010-05-17 12 views
6

Tengo una aplicación que se ejecuta como un servicio de Windows. Almacena varias configuraciones de cosas en una base de datos que se buscan cuando se inicia el servicio. Creé el servicio para admitir varios tipos de bases de datos (SQL Server, Oracle, MySQL, etc.). Muchas veces los usuarios finales eligen configurar el software para usar SQL Server (simplemente pueden modificar un archivo de configuración con la cadena de conexión y reiniciar el servicio). El problema es que cuando su máquina arranca, muchas veces SQL Server se inicia después de mi servicio, por lo que mi servicio se equivoca al iniciarse porque no se puede conectar a la base de datos. Sé que puedo especificar dependencias para mi servicio para ayudar a guiar al administrador de servicios de Windows para que inicie los servicios apropiados antes que los míos. Sin embargo, no sé de qué servicios depender en el momento de la instalación (cuando mi servicio está registrado) ya que el usuario puede cambiar las bases de datos más adelante.Establecer dependencias de servicio después de la instalación

Así que mi pregunta es: ¿hay alguna manera para que el usuario indique manualmente las dependencias del servicio en función de la base de datos que está utilizando? Si no, ¿cuál es el enfoque de diseño adecuado que debería tomar? He pensado en intentar hacer algo así como esperar 30 segundos después de que mi servicio se inicie antes de conectarme a la base de datos, pero esto parece realmente escamoso por varias razones. También consideré tratar de conectarme "perezosamente" a la base de datos; el problema es que necesito una conexión inmediatamente después de la puesta en marcha, ya que la base de datos contiene varias piezas de información vital que mi servicio necesita cuando comienza. ¿Algunas ideas?

Respuesta

3

Dennis lo que usted está buscando es SC.exe. Esta es una herramienta de línea de comandos que los usuarios pueden usar para configurar servicios.

sc [Servername] Command Servicename [Optionname= Optionvalue...] 

más especificamente que se desea utilizar

sc [ServerName] config ServiceName depend=servicetoDependOn 

Aquí hay un enlace sobre las opciones para commandlike SC.EXE http://msdn.microsoft.com/en-us/library/ms810435.aspx

+1

Gracias Esto sin duda ayudará. Esto no es del todo ideal ya que ahora debo instruir a mis usuarios finales para que ejecuten este comando, pero es mejor que nada. – Dennis

1

Una solución (lejos de ser ideal) código posible:

En su método de inicio, codifíquelo como un bucle que finaliza cuando tiene una conexión. Luego, en esa trampa bucle de cualquier error de conexión de base de datos y volver a intentar mantener como ilustra el siguiente pseudocódigo:

bool connected = false; 
while (!connected) 
{ 
    try 
    { 
     connected = openDatabase(...); 
    } 
    catch (connection error) 
    { 
     // It might be worth waiting for some time here 
    } 
} 

Esto significa que su programa no continuará hasta que tenga una conexión. Sin embargo, también podría significar que su programa nunca salga de este ciclo, por lo que necesitaría alguna forma de terminarlo, ya sea manualmente o después de una cierta cantidad de intentos.

Como necesita que su servicio comience en un tiempo razonable, este código no puede ir en la inicialización principal. Debe organizar que su programa "comience" con éxito, pero no hacer ningún procesamiento hasta que este método haya retornado al connected = true. Puede lograr esto colocando este código en un hilo y luego comenzando su código de aplicación real en el evento "hilo terminado".

+0

No creo que esto ayude, ya que el administrador de servicios de Windows esperará a que mi servicio complete su inicio antes de intentar iniciar el siguiente servicio ... – Dennis

+0

@Dennis - buen punto. – ChrisF

0

No es una respuesta directa poner algunos puntos se puede mirar en

  1. servicio de Windows se puede iniciar automáticamente con un retraso. Puede verificar esta pregunta en SO para obtener información al respecto.

How to make Windows Service start as “Automatic (Delayed Start)”

  1. Comprobar este post How to: Code Service Dependencies
+0

Gracias por el enlace de inicio demorado. Lamentablemente, solo está disponible en Vista y más adelante, por lo que no funcionará para mis usuarios que usan XP y Server 2003. – Dennis

Cuestiones relacionadas