offer - queue java docs
Java: una cola demorada que elimina los engaƱos (2)
Puede notificar al sistema solo que se ha producido un cambio y hacer que el otro sistema obtenga el nuevo estado. Luego, no notifique cambios adicionales hasta que se haya obtenido el estado.
Todos los días,
Tengo un sistema (la fuente) que necesita notificar a otro sistema (el objetivo) de forma asincrónica cada vez que ciertos objetos cambian. El giro es que el sistema de origen puede mutar un solo objeto muchas veces en un intervalo corto (las actualizaciones son muy "explosivas"), y en ese caso sería ideal notificar solo al sistema de destino una vez, y con el estado final de la objeto.
Mi idea era utilizar algún tipo de cola retrasada y diferida frente a un ThreadPoolExecutor para esto. Esta cola:
mantenga los artículos en la cola por un tiempo mínimo (idealmente configurado para ser solo una pizca más larga que la duración de un estallido típico de mutaciones)
reemplace el objeto existente en el caso de que un duplicado (como se define por el identificador del objeto) se ponga en cola. Sin embargo, el ítem debe conservar su lugar original en la cola (para evitar que un ítem sea perpetuamente topado al final de la cola, en algún momento solo debemos enviar la notificación, incluso si otro se acerca momentáneamente).
No he visto nada exactamente así en java.util, y mi google-fu en esta área parece ser particularmente débil.
¿Alguien ha implementado esto antes, conoce una implementación de BlockingQueue que se comporta de esta manera, o tiene consejos sobre cómo podría implementarla?
¡Gracias por adelantado!
Peter
PD. Sé que los ESB hacen este tipo de cosas, pero ese es un enfoque demasiado pesado en este caso; idealmente, no quiero agregar ninguna nueva dependencia de biblioteca al sistema fuente en absoluto.
Creo que su mejor ArrayBlockingQueue
es extender ArrayBlockingQueue
y anular la offer
y la poll
para agregar la funcionalidad de retraso de tiempo. Particularmente ArrayBlockingQueue
porque tiene un método contains
.
Otra idea es un DelayQueue
donde anula la offer
para eliminar el elemento anterior e insertar el nuevo, pero conserva el viejo retraso, que esencialmente preservará el orden. Luego debe envolver sus elementos de cola en una interfaz Delayed
.