2011-05-28 14 views
7

He desarrollado un servicio de Windows, que debe iniciarse automáticamente durante el inicio de Windows. Este servicio se conecta a un db Oracle, así que hice mi servicio depende de los servicios de Oracle mediante la utilidad de línea de comandos sc: sc config = MyService dependen OracleServiceXE/OracleXETNSListenerInicio de servicio de Windows automáticamente al inicio de Windows que depende de Oracle

Hasta aquí todo bien, la dependencia se estableció con éxito. Pero cuando se inicia Windows, mi servicio no puede iniciarse, recibo el siguiente mensaje de error (Oracle): "ORA-12528: TNS: oyente: todas las instancias adecuadas bloquean las conexiones nuevas".

Como creo, los servicios de Oracle se inician cuando se inicia mi servicio, pero no están "totalmente inicializados". Después de algunos segundos, puedo comenzar mi servicio desde la consola de servicio sin ningún problema.

Entonces, ¿cómo puedo iniciar automáticamente mi servicio en Windows Startup, que depende de una conexión Oracle DB?

Mi servicio fue desarrollado en C# en plataforma .Net 4, en entorno VS 2010.

Pls. ¡ayúdame, es una tarea realmente importante para mí!

Respuesta

10

Recuerde, el código para el inicio de su servicio debe hacer tan poco como sea posible. En otras palabras, no haga que su servicio de arranque compruebe la disponibilidad del servidor de Oracle, o de hecho haga algo. Que su servicio haga lo siguiente:

  • registrar el hecho de que se inició
  • Carga cualquier configuración aplicable a partir de los archivos de configuración/registro/etc
  • volver a acelerarse un hilo que va a tratar de "arranque" del servicio correctamente cada N segundos, y repetirá M veces hasta que se rinda. Tener N y M configurables desde su archivo/registro de configuración

Haga que el hilo "intente" conectarse al servidor Oracle aplicable y, si falla, vaya a dormir durante N segundos y hágalo M veces. Si tiene éxito, entonces puede comenzar a hacer la "carne" de lo que se supone que debe.

Irónicamente, es probable que el hecho de que el servicio de Oracle haga algo similar a lo que te he propuesto que hagas te esté causando el problema. Al devolver "Sí, comencé" rápidamente a Windows cuando se inició, permite que su servicio se cargue, aunque Oracle todavía está ocupado haciendo girar cosas. Idealmente, en este escenario, en lugar de rechazar sus solicitudes, Oracle debería ponerlas en cola para su procesamiento cuando esté listo.

+0

Thx your answer. Suena muy mal para mí :(. Mi servicio debe conectarse a 'cualquier' tipo de db que se configuró en el archivo de configuración (mysql, ms access, sqlite ...), por lo que puede ejecutarse usando diferentes db-s. tener este tipo de problema solo en el caso de Oracle. Por lo tanto, me parece muy malo volver a diseñar mi aplicación solo por Oracle. Pensé que había una solución mucho más directa .(¡De nuevo! – Tom

+1

@Keller, puedes '' Asegúrese de que * cualquier * servidor de bases de datos no muestre este comportamiento, por lo que no debe doler poner este tipo de "resiliencia '' en su servicio. ¡Molesto, pero no sin fin! La otra ventaja que obtiene de la separación su "lógica comercial" desde el núcleo del servicio en sí es la capacidad de prueba, es mucho más fácil escribir pruebas para el código que no está vinculado con el método "OnStart" de un servicio de Windows =) – Rob

Cuestiones relacionadas