Pregunta

Tenemos ActiveMQ en el que se publican los eventos que ocurren en el sistema. El proyecto involucra a los usuarios que agregan entidades a su lista de relojes y cada vez que hay eventos en esas entidades, me gustaría que se envíe un correo electrónico a los participantes interesados.

El caso de uso se traduce aproximadamente en alguien que expresa interés en una página de información del producto en el catálogo y un correo electrónico que se envía cada vez que ocurre cualquier actividad en ese producto (el precio cae, hay una revisión positiva, etc.). Había modelado esta interacción como una ruta de camello.

Entonces, por ejemplo, si el usuario dice que envíeme un correo electrónico cada vez que la calificación de este producto es igual a 5, entonces la siguiente ruta se agregaría al contexto de Camel:

from("activemq:topic:events.product.save").filter().xpath("/object[<object id>]/rating").isEqualTo("5").to("email:<user's email>")

Del mismo modo, si el usuario quiere ser notificado cada vez que haya un nuevo comentario sobre un producto, se crearía otra ruta, etc. Potencialmente, esto podría terminar creando miles de rutas a medida que cada usuario comienza a agregar sus relojes de interés.

Algunas preguntas que tengo son:

  • ¿Es esta una forma aceptable de crear rutas dinámicas? Una opción que estoy considerando es usar listas de destinatarios. Pero no he podido encontrar una solución que sea elegante enrutar mensajes al bean que devolvería la lista de destinatarios. Por ejemplo, para el caso explicado anteriormente, ¿el bean tendría un montón de If-Else para ver qué lista de destinatarios devolver?

  • CamelContext tiene un método para cargar rutas desde un archivo XML pero no hay método para persistir las rutas existentes. ¿Cuál sería la forma más simple (y eficiente) de persistir estas rutas creadas dinámicamente? Este hilo en el Lista de usuarios de camello resume mi solicitud.

¿Fue útil?

Solución

Dada la naturaleza dinámica de sus requisitos de suscripción, debe usar una base de datos para almacenar la información en lugar de tratar de crear rutas dinámicas. Este es un uso mucho más escalable/apropiado de la tecnología ...

Entonces solo puede necesitar una sola ruta estática o una Consumidor de POJO (ver más abajo) que puede procesar los mensajes de actualización del producto utilizando un POJO Bean simple (unión a frijoles puede ayudar, etc.). El pojo bean sería responsable de consultar la base de datos para encontrar a todos los usuarios "interesados" y enviar un correo electrónico utilizando correo de camello

public class NotificationBean {

    @Consume(uri="activemq:topic:events.product.save")
    public void onUpdate(@XPath("/object/id") String id, 
                         @XPath("/object/rating") String rating) {
        //query database for subscriptions for this product ID/rating, etc.
        //for each interested subscriber
            //send email (camel-mail, etc)
    }

    public void addSubscription(String productID, Integer rating, String email) {
        //create/update subscription entry in database, etc...
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top