dubbo tiempo de inactividad elegante

Cuando, directamente venido siendo dado nuevas solicitudes al proveedor de servicios de parada, marcado como el primero en recibir nuevas solicitudes, por lo que el cliente reintenta las otras máquinas. Entonces, la detección del hilo de rosca de la piscina está en marcha, y si es así, espere a que todas las discusiones hasta la ejecución completa, a menos que un tiempo de espera, y luego obligados a cerrar. Cuando el consumidor del servicio se detiene y no iniciar una nueva petición de llamada, toda nueva llamada que se está dando cliente.
Luego, en respuesta a la detección no hay ninguna solicitud no ha vuelto todavía, volver a esperar una respuesta a menos que un tiempo de espera está cerrada por la fuerza.

Aquí para hablar de lo que es el procedimiento de enlace:
los programas de Java se pueden desactivar mediante la adición de un gancho para lograr una estrecha el recurso al salir del programa, liso función de salida.
utilice el método Runtime.addShutdownHook (gancho de rosca), puede registrar una JVM fuera del gancho, el gancho puede ser invocada en los siguientes escenarios:

  1. Programa sale normalmente
  2. Uso System.exit ()
  3. End-uso Ctrl + C gatillo de interrupción
  4. apagado del sistema
  5. El uso de muertes pid comando para matar el proceso

Nos Runtime.getRuntime().addShutdownHook()registramos un gancho, encontrado para ser ApplicationShutdownHooks.add(hook)llamados, y finalmente se guardará en una llamada HOOKSIdentityHashMap ellos, que es cuando se engancha el gatillo es? El original ApplicationShutdownHooksque tiene un bloque estático:

    static {
        try {
            Shutdown.add(1 /* shutdown hook invocation order */, false /* not registered if shutdown in progress */, new Runnable() { public void run() { runHooks(); } } ); hooks = new IdentityHashMap<>(); } catch (IllegalStateException e) { hooks = null; } } 

llama finalmente runHooksel método. Vemos System.exit(), de hecho, con el tiempo pasar ShutDown.exit()->sequence()a llegar, a continuación, llamar a runHooksprocedimientos de gancho de llamada. Es así como la respuesta de Java killmandó? Por realmente SignalHandleralcanzado, en las ventanas y Solaris directorio tiene un directorio de OpenJDK Terminator.java, que tiene un pedazo de código como el siguiente:

    SignalHandler sh = new SignalHandler() { public void handle(Signal sig) { Shutdown.exit(sig.getNumber() + 0200); } }; Signal.handle(new Signal("HUP"), sh); Signal.handle(new Signal("INT"), sh); Signal.handle(new Signal("TERM"), sh); 

Por último, la void* oldHandler = os::signal(sig, newHandler)señal al sistema de adquisición de la señal Linux.


Mirando hacia atrás una mirada dubbo, puede desencadenar el elegante tiempo de espera, el tiempo de espera predeterminado es de 10 segundos de tiempo de espera :( se ve obligado a cerrar)

<dubbo:application ...> <dubbo:parameter key="shutdown.timeout" value="60000" /> <!-- 单位毫秒 --> </dubbo:application> 

Mira el procedimiento de enlace del lado del servidor:

  Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { public void run() { if (logger.isInfoEnabled()) { logger.info("Run shutdown hook now."); } ProtocolConfig.destroyAll(); } }, "DubboShutdownHook")); 

Que en última instancia llama al ProtocolConfig.destroyAll()método:

    public static void destroyAll() { AbstractRegistryFactory.destroyAll(); ExtensionLoader<Protocol> loader = ExtensionLoader.getExtensionLoader(Protocol.class); for (String protocolName : loader.getLoadedExtensions()) { try { Protocol protocol = loader.getLoadedExtension(protocolName); if (protocol != null) { protocol.destroy(); } } catch (Throwable t) { logger.warn(t.getMessage(), t); } } } 

Cargar todos los Protocolprotocolos, y después de llamar al ciclo destroymétodo, el aspecto siguiente en DubboProtocolel destroymétodo:

    public void destroy() { for (String key : new ArrayList<String>(serverMap.keySet())) { ExchangeServer server = serverMap.remove(key); if (server != null) { try { if (logger.isInfoEnabled()) { logger.info("Close dubbo server: " + server.getLocalAddress()); } server.close(getServerShutdownTimeout()); } catch (Throwable t) { logger.warn(t.getMessage(), t); } } } for (String key : new ArrayList<String>(referenceClientMap.keySet())) { ExchangeClient client = referenceClientMap.remove(key); if (client != null) { try { if (logger.isInfoEnabled()) { logger.info("Close dubbo connect: " + client.getLocalAddress() + "-->" + client.getRemoteAddress()); } client.close(); } catch (Throwable t) { logger.warn(t.getMessage(), t); } } } for (String key : new ArrayList<String>(ghostClientMap.keySet())) { ExchangeClient client = ghostClientMap.remove(key); if (client != null) { try { if (logger.isInfoEnabled()) { logger.info("Close dubbo connect: " + client.getLocalAddress() + "-->" + client.getRemoteAddress()); } client.close(); } catch (Throwable t) { logger.warn(t.getMessage(), t); } } } stubServiceMethodsMap.clear(); super.destroy(); } 
  • Cierre el servidor
    porque el servidor a través DubboProtocoldel openServerservicio abierto de Netty, serverMap.put(key, createServer(url)). Cuando la hora de cierre sin duda tendrá que cerrar los servicios, puertos y los recursos del sistema de liberación.
  • Cerrar cliente referencia
    compartir enlaces, ReferenceCountExchangeClient
  • Cerca cliente fantasma (comentario oficial llamado cliente fantasma)
    Esta operación es sólo para medidas defensivas error de programa bug cierre cliente debe hacer para evitar
  • Método talón de vacío Mapa
  • suer.destroy
    fuera de invocador, servicio no disponible siempre. A continuación, cierre el servicio exportado por Exporter.unexport ()


Autor: Jerrik
enlace: https: //www.jianshu.com/p/6e4d1ecb0815
Fuente: libros de Jane
tienen derechos de autor por el autor. reimpresión comercial póngase en contacto con el autor autorizada, reimpresión no comercial por favor indique la fuente.

Supongo que te gusta

Origin www.cnblogs.com/sidesky/p/12669063.html
Recomendado
Clasificación