Ho il seguente requisito.
Leggi i dati da una coda di messaggistica ed elabora ciascun messaggio per arricchire il messaggio e infine invia il messaggio arricchito a un altro sistema. La logica di arricchimento è in DB e si basa sul tipo di messaggio e ogni logica può essere di lingua diversa. Ogni messaggio avrà un tipo come, banca, assicurazione, ...
Dati logici di arricchimento del campione in Mongo DB,
{
type : "Bank",
logics : [
{
"key" : "location.phone",
"type" : "javascript",
"logic" : "function getPhone() { return '888-888-8888';}"
},
{
"key" : "location.zip",
"type" : "groovy",
"logic" : "function getZip() { return '56781';}"
},
{
"key" : "location.address",
"type" : "groovy",
"logic" : "function getAddress() { return '1234 new address';}"
},
]
}
Ora dopo aver ricevuto ciascun messaggio dalla coda, controlla il tipo e arricchisci i dati in base alle logiche per quel tipo.
Questa è un'applicazione Java non Web di avvio a molla.
Il mio esecuzione sarebbe iniziato dal metodo di esecuzione inferiore.
public class AppRunner implements ApplicationRunner {
// Other Bean injection is here
@Override
public void run(final ApplicationArguments args) throws Exception {
// Application starts here ...
}
}
Ho definito EnrichmentLogicDAO per caricare la logica dal DB e disporre di EnrichmentDBService per DAO. Avere un'interfaccia con un metodo exeucte (Command pattern). Ci sono 2 implementatori. 1. Javascript, 2. Groovy
In Javascript executor,
Motore ScriptEngine = new ScriptEngineManager (). getEngineByName ("JavaScript");
In Groovy executor,
Motore ScriptEngine = new ScriptEngineManager (). getEngineByName ("groovy");
In entrambi,
engine.eval (logic1); engine.eval (logic2); ....
Carica tutta la logica dal DB. La logica basata su Javascript deve essere caricata nel motore JavaScriptExecutor e la logica basata su Groovy deve essere caricata nel motore GroovyExecutor.
Domanda 1: -
Come caricare tutte le logiche sul motore corrispondente?
Attualmente ho il mio codice per caricare la logica nel metodo di esecuzione di AppRunner e chiamare il metodo statico corrispondente della classe Executor in base al tipo da DB per caricare le logiche nel motore.
Domanda 2: -
Il codice per eseguire la logica di arricchimento rimane lo stesso per entrambi i motori. Solo il motore sarà diverso in base al tipo di logica.
Ho bisogno di aiuto per caricare le logiche sul motore corrispondente e richiamare la logica su ciascun messaggio.
Inoltre, ho pensato di utilizzare il pattern Chain of responsibility, in modo che il messaggio di input venisse passato alla serie di motori e il messaggio verrà arricchito in base alle logiche caricate in ciascun motore. C'è un altro approccio migliore.