Java Design for Data arricchimento basato su logica definita in un database

0

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.

    
posta user1578872 24.12.2018 - 09:33
fonte

1 risposta

0

Per iniziare le cose in modo semplice, dovresti creare un semplice ciclo prendendo ogni "logica" ed eseguendo ogni operazione dall'inizio alla fine. Quindi aggiungi una dipendenza per EnrichmentDBService e richiedi direttamente le logiche per il tuo contributo.

Quindi, per ogni logica, si applica la modifica. Per applicare ogni modifica, è necessario utilizzare un enum o una sorta di mappatura diretta tra il tipo "javascript" o "groovy" e l'appropriata istanza ScriptEngine relativa a quel particolare linguaggio.

Usando questa mappatura, prendi l'istanza di ScriptEngine corretta ed esegui il suo codice. Ciò che viene restituito è necessario impostare su un oggetto utilizzando il valore "chiave" presumibilmente.

Una volta che hai completato tutte le logiche in questo modo, hai finito! Restituisce l'oggetto finito.

Se l'ordine non è cruciale e ci sono molte logiche, potresti considerare l'utilizzo di un pool di thread per gestire le attività. Non suggerirei Chain of Responsibility perché sembra che il vero lavoro svolto sia lo stesso qui. Tuttavia, temo che ciò che vogliono da te sia che interpreti i valori restituiti come una sorta di maschera da applicare ai dati effettivi.

Se, ad esempio, '888-888-8888' è una maschera per l'applicazione di un numero, allora avrai bisogno di una sorta di regola di base per questo. Significa questo quando vedi '8', lo rappresenti come una cifra? Che dire di "1234 nuovo indirizzo"? Il '1234' dovrebbe essere sostituito con il numero civico? Perché non dovresti interpretarlo come un letterale '1234'?

Queste domande non puoi rispondere a te stesso. Quello che fornisce le specifiche dovrebbe dirti questo, e devi cercare potenziali incoerenze e portarle all'attenzione di colui che esegue l'analisi. Fai questo fino a coprire tutti i casi e non ci sono incoerenze prima inizi la codifica.

Buona fortuna!

    
risposta data 24.12.2018 - 10:08
fonte

Leggi altre domande sui tag