2015-04-17 21 views
5

Sto scrivendo un'applicazione di integrazione di primavera che dovrebbe contenere più file (potrebbe essere fino a 100). Sto usando OSDelegatingFileTailingMessageProducer come origine del messaggio, che è l'inizio di una pipeline che coinvolge più filtri e canali.Integrazione molla con coda di file multipli

La codifica di un file funziona correttamente con questa pipeline con un file di configurazione XML per i canali e i trasformatori, ma codificare molti di questi file significherebbe la moltiplicazione di questa configurazione XML, che non è una buona pratica di programmazione ai miei occhi.

Immagino che dovrò costruire queste pipeline all'interno di Java progettando in modo programmatico un contesto di applicazione Spring. Ci sono altre opzioni?

EDIT:

Probabilmente utilizzando il BeanFactoryPostProcessor è la strada da percorrere: https://stackoverflow.com/a/15773000/2069922?

risposta

4

Penso che sarebbe più semplice creare i produttori di messaggi a livello di codice e collegarli allo stesso outputChannel. Non c'è davvero alcuna necessità di creare un contesto di applicazione Spring ogni volta. Ottieni il canale dal contesto (ad esempio @AutoWired) e imposta outputChannel.

Gli adattatori polling sono un po 'più complicati ma, in questo caso, ciascun adattatore di coda è un semplice fagiolo singolo.

Basta assicurarsi di invocare afterPropertiesSet() e start() dopo aver impostato le proprietà.

Tuttavia, se si desidera un flusso downstream univoco per ciascun utente, è possibile utilizzare una tecnica simile a dynamic ftp sample, con contesti applicativi parametrizzati.

0

Alla fine non ho registrato le istanze di OSDelegatingFileTailingMessageProducer con il contesto dell'applicazione Spring, perché non era necessario, come suggerito da Gary. Invece ho usato un ApplicationListener e l'ho registrato con il mio contesto Spring. Quindi ho creato i tailers all'interno del metodo onApplicationEvent (...). Ecco una versione minimale:

public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> { 

    @Autowired 
    @Qualifier("outputChannel") 
    private SubscribableChannel outputChannel; 


    @Override 
    public void onApplicationEvent(ContextRefreshedEvent event) { 
    OSDelegatingFileTailingMessageProducer tailer = new OSDelegatingFileTailingMessageProducer(); 
    tailer.setOutputChannel(outputChannel); 
    tailer.setFile(new File("/file/to/tail.txt")); 
    tailer.setOptions("-f -n 0"); 
    tailer.afterPropertiesSet(); 
    tailer.start(); 
    } 
} 

EDIT:

Inoltre abbiamo finito per non usare l'OSDelegatingFileTailingMessageProducer, ma quello da apache, dal momento che il comando tail si comporta in modo diverso su diverse versioni di Unix. A prima vista non è stato possibile identificare alcuna differenza di prestazioni.

Problemi correlati