En algún momento veo muchas aplicaciones como msn, windows media player, etc. que son aplicaciones de instancia única (cuando el usuario ejecuta mientras la aplicación se está ejecutando, no se crea una nueva instancia de aplicación).
En C #, uso la Mutex
clase para esto, pero no sé cómo hacerlo en Java.
java
single-instance
Fuangwith S.
fuente
fuente
Respuestas:
Si creo este artículo , por:
Nota: Ahe menciona en el comentario que usar
InetAddress.getLocalHost()
puede ser complicado:getLocalHost
: dirección IP de retorno de la máquina, vs. Resultados reales: retorno127.0.0.1
.O puede usar
ManagementFactory
object. Como se explica aquí :JNLP ofrece también un
SingleInstanceListener
fuente
InetAddress.getLocalHost()
no funciona como se esperaba en el entorno DHCP porque la dirección devuelta depende de si la computadora tiene acceso a la red. La solución fue abrir la conexión conInetAddress.getByAddress(new byte[] {127, 0, 0, 1});
.InetAddress.getByName(null)
devuelve la dirección de la interfaz de bucle de retorno. Supongo que esto es mejor que especificar 127.0.0.1 manualmente porque, en teoría, esto también debería funcionar en entornos de solo IPv6.Utilizo el siguiente método en el método principal. Este es el método más simple, robusto y menos intrusivo que he visto, así que pensé en compartirlo.
fuente
Si la aplicación. tiene una GUI, ejecútelo con JWS y use el
SingleInstanceService
.Actualizar
El complemento de Java (necesario para los subprogramas y las aplicaciones JWS) fue obsoleto por Oracle y eliminado del JDK. Los fabricantes de navegadores ya lo habían eliminado de sus navegadores.
Entonces esta respuesta está extinta. Solo lo dejo aquí para advertir a las personas que buscan documentación antigua.
fuente
Sí, esta es una respuesta realmente decente para la aplicación de instancia única de eclipse RCP eclipse a continuación es mi código
en application.java
fuente
Usamos el bloqueo de archivos para esto (agarre un bloqueo exclusivo en un archivo mágico en el directorio de datos de la aplicación del usuario), pero estamos interesados principalmente en evitar que se ejecuten varias instancias.
Si está intentando que la segunda instancia pase argumentos de línea de comando, etc. a la primera instancia, entonces el uso de una conexión de socket en localhost matará dos pájaros de un tiro. Algoritmo general:
fuente
He encontrado una solución, una explicación un poco caricaturesca, pero todavía funciona en la mayoría de los casos. Utiliza el antiguo archivo de bloqueo simple para crear cosas, pero en una vista bastante diferente:
http://javalandscape.blogspot.com/2008/07/single-instance-from-your-application.html
Creo que será de ayuda para aquellos con una configuración de firewall estricta.
fuente
Puede utilizar la biblioteca JUnique. Proporciona soporte para ejecutar aplicaciones java de instancia única y es de código abierto.
http://www.sauronsoftware.it/projects/junique/
Bajo el capó, crea bloqueos de archivos en la carpeta% USER_DATA% /. Junique y crea un socket de servidor en un puerto aleatorio para cada appId único que permite enviar / recibir mensajes entre aplicaciones Java.
fuente
En Windows, puede utilizar launch4j .
fuente
Clase ManagementFactory compatible con J2SE 5.0 o detalles posteriores
pero ahora uso J2SE 1.4 y encontré este http://audiprimadhanty.wordpress.com/2008/06/30/ensuring-one-instance-of-application-running-at-one-time/ pero nunca lo pruebo. ¿Qué piensa usted al respecto?
fuente
Puede intentar utilizar la API de preferencias. Es una plataforma independiente.
fuente
Una forma más genérica de limitar el número de instancias en una sola máquina, o incluso en una red completa, es usar un socket de multidifusión.
El uso de un socket de multidifusión le permite transmitir un mensaje a cualquier cantidad de instancias de su aplicación, algunas de las cuales pueden estar en máquinas físicamente remotas a través de una red corporativa.
De esta manera, puede habilitar muchos tipos de configuraciones, para controlar cosas como
El soporte de multidifusión de Java se realiza a través del paquete java.net, siendo MulticastSocket y DatagramSocket las herramientas principales.
Nota : MulticastSocket no garantiza la entrega de paquetes de datos, por lo que debe utilizar una herramienta construida sobre sockets de multidifusión como JGroups . JGroups hace garantiza la entrega de todos los datos. Es un solo archivo jar, con una API muy simple.
JGroups ha existido por un tiempo y tiene algunos usos impresionantes en la industria, por ejemplo, respalda el mecanismo de agrupación de JBoss para transmitir datos a todas las instancias de un clúster.
Para usar JGroups, limitar la cantidad de instancias de una aplicación (en una máquina o red, digamos: a la cantidad de licencias que un cliente ha comprado) es conceptualmente muy simple:
fuente
Puede abrir un archivo asignado en memoria y luego ver si ese archivo ya está ABIERTO. si ya está abierto, puede regresar desde main.
Otra forma es usar archivos de bloqueo (práctica estándar de Unix). Una forma más es poner algo en el portapapeles cuando main se inicia después de verificar si ya hay algo en el portapapeles.
De lo contrario, puede abrir un socket en modo de escucha (ServerSocket). Primero intente conectarse al enchufe; si no puede conectarse, abra un socket de servidor. si se conecta, sabrá que ya se está ejecutando otra instancia.
Por lo tanto, se puede utilizar prácticamente cualquier recurso del sistema para saber que una aplicación se está ejecutando.
BR, ~ A
fuente
Usé sockets para eso y, dependiendo de si la aplicación está en el lado del cliente o en el lado del servidor, el comportamiento es un poco diferente:
fuente
fuente
EDITAR : En lugar de usar este enfoque WatchService, se podría usar un simple hilo de temporizador de 1 segundo para verificar si el indicadorFile.exists (). Bórrelo, luego lleve la aplicación a Front ().
EDITAR : Me gustaría saber por qué se votó en contra. Es la mejor solución que he visto hasta ahora. Por ejemplo, el enfoque del socket del servidor falla si otra aplicación ya está escuchando el puerto.
Simplemente descargue Microsoft Windows Sysinternals TCPView (o use netstat), inícielo, ordene por "Estado", busque el bloque de línea que dice "ESCUCHANDO", elija uno cuya dirección remota diga el nombre de su computadora, coloque ese puerto en su nuevo Socket ()-solución. En mi implementación, puedo producir fallas en todo momento. Y es lógico , porque es la base misma del enfoque. ¿O qué no obtengo con respecto a cómo implementar esto?
Por favor, infórmeme si me equivoco al respecto y en qué medida.
Mi punto de vista, que le pido que refute si es posible, es que se aconseja a los desarrolladores que utilicen un enfoque en el código de producción que fallará en al menos 1 de aproximadamente 60000 casos. Y si este punto de vista resulta ser correcta, entonces se puede absolutamente no ser que una solución presentada que no tiene este problema se downvoted y criticada por su cantidad de código.
Desventajas del enfoque de socket en comparación:
Acabo de tener una buena idea sobre cómo resolver el problema de comunicación de Java de nueva instancia a instancia existente de una manera que debería funcionar en todos los sistemas. Entonces, preparé esta clase en aproximadamente dos horas. Funciona a las mil maravillas: D
Se basa en el enfoque de bloqueo de archivos de Robert (también en esta página), que he usado desde entonces. Para decirle a la instancia que ya se está ejecutando que otra instancia intentó iniciarse (pero no lo hizo) ... se crea un archivo y se elimina inmediatamente, y la primera instancia usa WatchService para detectar este cambio de contenido de carpeta. No puedo creer que aparentemente esta sea una idea nueva, dado lo fundamental que es el problema.
Esto se puede cambiar fácilmente para simplemente crear y no eliminar el archivo, y luego se puede poner información en él que la instancia adecuada puede evaluar, por ejemplo, los argumentos de la línea de comando, y la instancia adecuada puede realizar la eliminación. Personalmente, solo necesitaba saber cuándo restaurar la ventana de mi aplicación y enviarla al frente.
Ejemplo de uso:
Aquí está la clase:
fuente
new ServerSocket()
con un bloque de captura es bastante adecuado,La biblioteca Unique4j se puede utilizar para ejecutar una sola instancia de una aplicación Java y pasar mensajes. Puede verlo en https://github.com/prat-man/unique4j . Es compatible con Java 1.6+.
Utiliza una combinación de bloqueos de archivos y bloqueos de puertos dinámicos para detectar y comunicarse entre instancias con el objetivo principal de permitir que solo se ejecute una instancia.
A continuación, se muestra un ejemplo simple de lo mismo:
Descargo de responsabilidad: creé y mantengo la biblioteca Unique4j.
fuente