Domanda

Abbiamo ActiveMQ su cui vengono pubblicati gli eventi che si verificano nel sistema. Il progetto coinvolge gli utenti che aggiungono entità alla loro lista di controllo e ogni volta che ci sono eventi su tali entità vorrei che un'e-mail venisse inviata ai partecipanti interessati.

Il caso d'uso si traduce approssimativamente in qualcuno che esprime un interesse per una pagina di informazioni sul prodotto sul catalogo e un'e-mail inviata ogni volta che si verifica qualsiasi attività su quel prodotto (il prezzo diminuisce, c'è una revisione positiva ecc.). Avevo modellato questa interazione come un percorso di cammello.

Quindi, ad esempio, se l'utente dice e -mail ogni volta che la valutazione di questo prodotto è uguale a 5, il seguente percorso verrebbe aggiunto al contesto del cammello:

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

Allo stesso modo se l'utente desidera essere avvisato ogni volta che c'è un nuovo commento su un prodotto, verrà creato un altro percorso e così via. Ciò potrebbe potenzialmente, finire per creare migliaia di percorsi mentre ogni utente inizia ad aggiungere i propri orologi di interesse.

Alcune domande che ho sono:

  • È un modo accettabile di creare percorsi dinamici? Un'opzione che sto prendendo in considerazione è utilizzare elenchi dei destinatari. Ma non sono stato in grado di trovare una soluzione che renderebbe elegante il percorso dei messaggi sul fagiolo che restituirebbe l'elenco dei destinatari. Ad esempio, per il caso spiegato sopra, il fagiolo avrebbe un sacco di if-else per vedere quale elenco dei destinatari restituire?

  • CamelContext ha un metodo per caricare le rotte da un file XML ma nessun metodo per persistere alle rotte esistenti. Quale sarebbe il modo più semplice (ed efficiente) per persistere queste rotte create dinamicamente? Questo thread in Elenco degli utenti di cammello riassume la mia richiesta.

È stato utile?

Soluzione

Data la natura dinamica dei requisiti di abbonamento, è necessario utilizzare un database per archiviare le informazioni piuttosto che provare a creare percorsi dinamici. Questo è un uso molto più scalabile/appropriato della tecnologia ...

Quindi puoi aver bisogno di un solo percorso statico o a Consumatore Pojo (vedi sotto) in grado di elaborare i messaggi di aggiornamento del prodotto utilizzando un semplice pojo bean (legame di fagioli può aiutare, ecc.). Il pojo bean sarebbe quindi responsabile della query sul database per trovare tutti gli utenti "interessati" e inviare un'e -mail utilizzando Cammello-Mail

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...
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top