Pregunta

Tenemos una aplicación cliente RMI escrito en Java, que tiene que enviar periódicamente mensajes de "seguir con vida" a una aplicación de servidor. Hemos implementado esto como un hilo separado latidos del corazón, que envía el mensaje vivo estancia en el servidor, a continuación, duerme durante 15 segundos utilizando Thread.sleep ().

El hilo se ajusta para que sea de alta prioridad:

Thread heartbeatThread = new Thread(new HeartbeatRunnable(server));
heartbeatThread.setPriority(Thread.MAX_PRIORITY);
heartbeatThread.start();

Sin embargo, cuando la caja en la que se ejecuta el cliente está utilizando una gran cantidad de CPU, nos encontramos con que los latidos del corazón se pierden, lo que hace que el servidor de asumir nuestra aplicación cliente ha muerto.

Hemos añadido Thread.yield () llama en mi hilo principal, aunque esto no ha hecho desaparecer el problema.

¿Hay alguna manera de garantizar que los latidos sean enviados a tiempo, mientras que mi aplicación aún está en marcha?

¿Fue útil?

Solución

Puede aplicar roscado en modo de usuario en un entorno no-roscada por la dispersión liberalmente una función "rendimiento" auto-escrito en su código.

Del mismo modo, se podría esparcir generosamente llamadas a funciones de verificación del latido del corazón en su código. Renunciar a la rosca, simplemente llame regularmente una función de latido del corazón que comprueba para ver si un latido del corazón todavía tiene que ser enviado.

Es una solución en bruto, pero teniendo en cuenta que haya probado la solución adecuada y no funciona, tal vez es algo que hay que recuperar.

De hecho, lo que podría hacer es colocar una macro al principio de cada llamada a la función, lo que lo hace una comprobación rápida en el tiempo y llama a la función latidos del corazón cuando sea necesario.

(Ah, ¿tiene macros en Java Creo que no? -, pero usted consigue la idea)

.

Otros consejos

Realmente no se puede garantizar. Usted puede enviar el latido del corazón en un hilo diferente para evitar que el tiempo que se tarda en enviar los latidos del corazón que se añade a su demora. También puede ser aconsejable ajustar el retardo entre dos latidos del corazón a la mitad el tiempo que el servidor utiliza para decidir un cliente está muerto, es decir, si los tiempos de servidor fuera su cliente después de 15 segundos, (intentan) envían un latido cada 7,5 segundos.

Depende de qué proceso está utilizando la CPU.

Si no es su proceso, por lo que el proceso de cliente realmente no responde, entonces es a todos los efectos, no está vivo, por lo que no envía un Latidos cardíacos es apropiado. Tener un mensaje de latido que dice 'estoy y puede procesar los mensajes' cuando la caja está demasiado cargado para hacer eso sería un error.

Si la intención del mensaje de latido es decir 'este proceso está en marcha, pero podría ser de media hora hasta que en contacto con usted', entonces todo lo que está haciendo que el procesamiento de enviar ese mensaje al servidor. O establecer el tiempo de espera para que se adapte a la capacidad de respuesta del cliente.

Es necesario configurar el número de "latidos perdidos" que el servidor espera antes de decidir que el cliente no está disponible.

Así, por ejemplo, si el intervalo de latidos es de 15 segundos y el número de latidos del corazón perdido es 4, entonces el servidor esperará hasta un máximo de 60 segundos (1 minuto) antes de decidir que el cliente es inalcanzable.

Tal vez la mejor solución sería utilizar de temporizador scheduleAtFixedRate . Con esto, si uno retrasos de ejecución (que no se pueden evitar en Java), no se verán afectadas las llamadas posteriores.

Si desea que el servidor de anunciar que está vivo, que puede ser mejor de la presentación de un socket abierto. En su cliente simplemente leer desde ese socket. Se va a bloquear (ya que el servidor no está escribiendo nada), y si el servidor desaparece / apaga el cliente obtendrá una IOException lo que indica que la toma de corriente / puerto del servidor ha desaparecido.

Esto no va a ser dependiente del servidor que proporciona los latidos del corazón oportunas. Utiliza pocos recursos (un puerto TCP en el lado del servidor y casi nada de ancho de banda) y es oportuna en revelar cuando el servidor (o servidor) deja de estar disponible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top