I metodi di una sola applicazione richiamati da molte altre applicazioni

3

Ho una piccola applicazione console Java che esegue un set di dati tramite un algoritmo. Data la dimensione dei dati e il tempo di elaborazione, eseguo spesso da 10 a 15 istanze dell'applicazione, ognuna delle quali lavora su un sottoinsieme di dati.

Tutto ciò che si sta comportando bene. L'applicazione occasionalmente stampa un sysout per le mie informazioni. Piuttosto che monitorare fino a 15 finestre di console, vorrei che tutti i sysouts venissero visualizzati in una finestra separata "monitor". Quindi, invece di un sysout, ogni applicazione avrebbe qualcosa di simile a

monitor.sendMessage("blah blah");

che invocerebbe un metodo sull'app monitor.

Non sono sicuro su come farlo perché ogni console è un'istanza separata dell'app. Presumo che avrei bisogno di creare una seconda app, ma poi non so come richiamarla e passare un messaggio ad essa dalle altre applicazioni. Ricorda che questa seconda app di monitoraggio deve trovarsi in una finestra della console separata.

Tutto questo sta accadendo localmente quindi preferisco evitare qualsiasi soluzione che usi HTTP o complessi protocolli di rete, se possibile

Infine sarebbe molto desiderabile poter avere una comunicazione bidirezionale, ovvero l'app monitor potrebbe anche invocare un metodo nelle altre app.

    
posta John Steed 13.04.2016 - 04:54
fonte

2 risposte

1

È possibile modificare un po 'il design come suggerito da me?

Utilizzare un file di registro comune per tutti i processi. È possibile leggere il registro da un'applicazione separata e visualizzare tutto ciò che è necessario in base ai filtri. Assicurarsi di registrare tutto in una transazione (si pensi sincronizzati ma per più processi). La scrittura di più processi di Otherwisse cancellerà i messaggi di registro.

Inoltre, anziché invocare qualcosa direttamente nella prima app, l'app che sta leggendo il log invia un messaggio alla prima app (può essere eseguita tramite JMS o solo file semplici. Assicurati di pulirla ogni volta). Non appena viene rilevato qualcosa, crea un file (s) in una directory predeterminata. Thread nella prima app attende qualsiasi file nella directory e lo elabora. Dovrai avere una convenzione su quale app legge questo messaggio quando hai detto di eseguire 10-15 app.

Potrebbe anche essere necessario il modo multi-thread per migliorare la comunicazione tra i thread utilizzando notify / interrupt, ecc. invece dei processi.

    
risposta data 13.04.2016 - 07:30
fonte
1

Perché non biforcare / eseguire questi processi da un processo principale (padre) ( utilizzando Runtime.process () )?

In questo modo il processo genitore genera processi secondari "n". Per necessità, il tuo processo genitore deve leggere lo stdout / stderr dei tuoi processi figli e puoi consolidare e mostrare tali informazioni per processo (dato che ogni processo generato avrà il proprio flusso di output). I processi figlio possono leggere il loro stdin (flusso della console di input) e il processo padre può scrivere i comandi su quel flusso per ogni processo figlio.

Come punto di riferimento, lo sto facendo ora per un cliente. Eseguo il mio processo genitore (usando un argomento --parent ), e questo separa più processi secondari (eseguendo lo stesso codice base ma con un argomento --child , invocando così un codice diverso). Fornisco comandi via stdin e cattura i registri tramite il processo figlio stdout / err e li rapporto. Poiché ogni bambino ha un thread di lettura diverso posso identificare banalmente quale processo figlio sta emettendo quale output.

    
risposta data 13.04.2016 - 10:46
fonte

Leggi altre domande sui tag