traduccion spanish juice google espaƱol common java guava

java - spanish - Servicio reiniciable usando guayaba



guava traduccion (3)

Considere el uso de los ámbitos de Guice.

Actualmente estoy desarrollando una aplicación en la que necesito gestionar el estado de varios servicios y detenerlos / iniciarlos en función de algunos eventos. El problema es que, como se indica en los documentos, el Servicio de Guava es unidireccional, lo que significa que, una vez que se ha detenido, no se puede volver a iniciar.

Como tengo que sortear este problema de alguna manera, me enfrento a un par de alternativas, que me gustaría poner en consideración (especialmente porque podría haber inconvenientes en cada una de las cuales no estoy al tanto).

La primera solución obvia para este problema, es crear una instancia de un nuevo Servicio cuando necesito "reiniciarlo". Esto funciona, pero en mi arquitectura actual complicaría un poco las cosas: actualmente estoy insinuando todos los servicios y, en función de los eventos de EventBus, puedo iniciarlos o detenerlos si es necesario. La clase que llama a los métodos de inicio y detención solo guarda una referencia a un Mapa de Servicios, y llama al método correcto en aquellas instancias basadas en el Evento recibido. Si necesito crear una instancia de un nuevo objeto en respuesta a un Evento, tendré que renunciar a parte del desacoplamiento que tengo actualmente (posiblemente al mantener la clase de cada tipo de Servicio e invocar al constructor utilizando la reflexión).

Otra posibilidad es implementar la interfaz del Servicio como un Servicio RestartableThreaded (o algo parecido a esto). Si tomé esta ruta, mi método de inicio () podría crear otro hilo como si fuera la primera vez, y restablecer los estados.

¿Hay alguna clara desventaja para el segundo enfoque? Me temo que podría faltar algún inconveniente obvio aquí (además de tener que codificar algo un poco más complicado), especialmente en lo que respecta a la gestión de subprocesos.


El mismo problema se rastrea en este github: https://github.com/google/guava/issues/418

Tengo un cambio propuesto aquí: https://github.com/okigan/guava/commit/8f51b155f9ce5c60236b9a9bfdc6ca5f8bf5e51d

Lo esencial es agregar un reset () a AbstractService que permita la transición de TERMINATED de nuevo a NUEVO:

public final void reset() { lock.lock(); try { switch (snapshot.state) { case TERMINATED: case FAILED: snapshot = new StateSnapshot(State.NEW); break; default: throw new AssertionError("Unexpected state: " + snapshot.state); } } catch (Throwable resetFailure) { notifyFailed(resetFailure); } finally { lock.unlock(); executeListeners(); } }


Recomiendo su primer enfoque, pero hay mejores maneras de hacerlo que la reflexión. El uso de la inyección de dependencia, o la posibilidad de pasar objetos del Supplier<Service> lugar de usar serviceClass.newInstance() , es probablemente el camino a seguir aquí.