mejores prácticas de plataforma cruzada/daemon/servicio de Java
cross-platform desktop-application (7)
Consulte JDIC, el proyecto de componentes de integración de Java Desktop. Es compatible con la integración de escritorio como la bandeja del sistema (o equivalente) con una API multiplataforma.
Otros han mencionado Quartz, que es un programador de tareas empresariales. Puede ser ligero, dependiendo de los trabajos que están programados, pero no tiene ninguna característica que esté inherentemente orientada al escritorio. Por el contrario, muchas de sus características dependen del soporte empresarial como una base de datos relacional. Si su aplicación se trata principalmente de tareas de programación, un servicio de Quartz sin cabeza que ejecuta trabajos, con un cliente de escritorio para interactuar con el servicio es un enfoque razonable.
Estoy buscando la mejor manera de hacer que mi programa Java de escritorio se ejecute en segundo plano (¿ daemon / servicio ?) En la mayoría de las plataformas (Windows, Mac OS, Linux [Ubuntu en particular]).
Por "la mejor manera", espero encontrar una manera que:
- requieren una cantidad mínima de código específico de la plataforma.
- no requiere que el usuario haga algo que un usuario general de computadora no podría / no haría
- no ser un cerdo de recursos.
Entiendo que mis requisitos pueden ser poco realistas, pero espero que haya algún tipo de "mejor práctica" para este tipo de situaciones.
¿Cómo avanzar?
Puede convertir cualquier programa Java en un servicio / daemon usando Java Service Wrapper . Es utilizado por múltiples proyectos OSS y se envía como parte del administrador de repositorio de Nexus Maven para que pueda instalarse como un servicio listo para usar. Para usarlo, usted, el autor, solo necesita crear un archivo de configuración y luego ejecutar un archivo por lotes simple para crear el servicio en Windows o copiar un guión de inicio al nivel de ejecución correcto en Linux.
El proyecto Apache Directory Daemon suena como la mejor forma de plataforma cruzada para hacer esto (con Java wrappers para JSVC bajo POSIX y procrun en Windows).
Si no necesita una solución gratuita, puede usar Advanced Installer (www.advancedinstaller.com), puede hacer que Win-service y MacOS instalen desde su JAR, y más ...
A veces las personas tienen dificultades para encontrar prunsrv.exe y / o prunmgr.exe (componentes de procrun), no está bien documentado en el sitio de apache, generalmente se puede encontrar en los archivos (nota: dicen que procrun es tomcat5.exe)
para Windows lo puede encontrar aquí: http://archive.apache.org/dist/commons/daemon/binaries/windows/commons-daemon-1.0.7-bin-windows.zip (contiene versiones de 32 y 64 bits)
no es necesario implementar la interfaz de daemon ni descargarla en absoluto, prunsrv se puede usar para convertir cualquier aplicación al servicio de Windows
navegar por ese archivo para otras plataformas
Puede usar las clases SystemTray e instalar su aplicación como cualquier otra en la plataforma predeterminada.
Para Windows podría ser una tarea programada que se ejecuta al inicio. Para Linux y OSX no lo sé (además de crontab, que de alguna manera es demasiado técnico), pero estoy bastante seguro de que ambos tienen una forma de hacer lo mismo fácilmente.
Lamentablemente (a partir de hoy) Apple no ha terminado el puerto 1.6.
No será un verdadero demonio, sino una aplicación como Google Desktop.
Escuché que Quartz es una buena opción. Pero nunca lo he usado.
Puede ejecutar una aplicación Java como un servicio (Windows) o un daemon (Linux) usando el código del demonio Apache Commons .
Estructura
Daemon está hecho de 2 partes. Uno escrito en C que hace la interfaz con el sistema operativo y el otro en Java que proporciona la API de Daemon.
Plataformas
Ambas plataformas como Win32 y UNIX son compatibles. Para las plataformas Win32, use procrun. Para plataformas similares a UNIX, use jsvc.
Código Java
Tienes que escribir una clase (MyClass) que implemente los siguientes métodos:
* void load(String[] arguments): Here open the configuration files, create the trace file, create the ServerSockets, the Threads
* void start(): Start the Thread, accept incoming connections
* void stop(): Inform the Thread to live the run(), close the ServerSockets
* void destroy(): Destroy any object created in init()