FMDominoFileWatcher: un plugin italiano per il monitoraggio su filesystem

plugin domino

  • 0 commenti
Che cosa è FMDominoFileWatcher

https://github.com/fmarzolo/FMDominoFileWatcher

Siamo nell'era dell'Inter-Planetary File System (IPFS) che non usa più i path http, ma gli hash, nell'era delle blockchain di prima, seconda e terza generazione, del linguaggio Rust che vuole dimenticare tutti i problemi dei linguaggi retrocompatibili (che fatica, ma bellissimo!).

Ma nell'attesa di appropriarci di queste tecnologie ci troviamo saltuariamente a cercare piccole soluzioni che rendano la vita dei nostri clienti più gradevole con gli strumenti che usano tutti i giorni. E magari facendo queste cose ci divertiamo a giocare ed imparare nuovi poteri espressivi, coding speaking.

Così un cliente reputava eccessivo il tempo di 5 minuti tra gli eventi di ripetizione di un agente  Domino che ha il compito di reperire i file da una cartella e allegarli all'interno di una libreria documentale dopo una pesante elaborazione che richiama dati via JDBC dal gestionale.

D'altronde impostare l'esecuzione di un agente Domino di una certa complessità in modo che parta molto frequentemente può avere controindicazioni sul piano delle performance.

Ho sviluppato quindi una classe che usa un servizio che consente di "registrare" (una specie di callback) il codice Java all'evento di modifica di file all'interno di cartelle del file system. Questo servizio è offerto dal package standard java.nio.file.WatchService.

In altre parole quando vengono creati nuovi file nelle cartelle configurate il sistema operativo "avvisa" il nostro codice che scatena un comando configurato, che può essere diverso per ogni cartella monitorata.

Per fare un esempio potremmo configurare le folder c:\filepdf\, d:\otherFolder\,  in modo che quando ricevono nuovi file lancino dei comandi Domino come:
- tell amgr run "tools\db1.nsf" 'Read PDF File'
- tell amgr run "tools\db2.nsf" 'other command'

Come fare però in modo che durante un evento di scaricamento di 10, 100, 1000 nuovi file non avvenga un temporale di comandi che lanciano il medesimo agent? Vengono in aiuto i thread, che vengono fatti partire con il compito di attendere un timer di qualche secondo di ritardo, e fermati se in quella manciata di secondi arrivano nuovi file.

In pratica una "promessa di esecuzione" che viene arrestata se accadono nuovi eventi e riavviata fino a che non accade un lasso di tempo sufficiente all'esecuzione. Questa promessa di esecuzione adesso è impostata a 5 secondi di ritardo.

Questa classe, più alcune companion che collaborano, sono sviluppate per funzionare su un substrato formato da uno splendido lavoro di Andy Brunner.

https://github.com/AndyBrunner/Domino-JAddin

Avevo visto da un po' di tempo che Andy Brunner ha pubblicato nel 2015 un ottimo strumento per poter facilitare il lavoro di uno sviluppatore che volesse creare un addin in linguaggio Java in esecuzione continua sul server.

Un addin sviluppato in questa modalità consente a qualsiasi sviluppatore che conosca Java anche marginalmente di ottenere risultati non così facilmente raggiungibili altrimenti. Infatti, utilizzando questa tecnica ci si trova a disposizione tutte le librerie Java standard e contemporaneamente l'accesso agli oggetti Domino. Una sala giochi per developer Domino! Java per i developer Lotusscript non è così lontana, le classi le conosciamo, è sufficiente curare bene i .recycle() (vedi bibliografia) e si produce codice abbastanza sicuro.

Pur essendo uno strumento non supportato, la facilità di implementare soluzioni Java ne fa una possibilità preferibile rispetto a parecchie altre.

Inoltre il grado di isolamento del task.run Java consente sufficiente sicurezza sulla stabilità del server Domino.

L'Addin java di Andy consente di sviluppare all'interno di specifiche molto semplici e molto precise.  Questo consente alla nostra classe Java di essere chiamata per l'esecuzione al momento in cui l'ambiente Domino è pronto per accogliere l'esecuzione del nostro codice. In pratica  dopo avere installato JAddin  è possibile scrivere sulla console Domino il seguente comando:

load runjava JAddin (nomeNostraClasse)

per avere in esecuzione il proprio codice, facilmente arrestabile in caso di problemi con il comando:
tell (nomeNostraClasse) quit

Facile no? Inoltre stiamo parlando di Java, quindi multiplatform!

Mi farebbe molto piacere avere dei feedback da sviluppatori più bravi di me che vogliano leggere il codice su https://github.com/fmarzolo/FMDominoFileWatcher e proporre migliorie. Ringrazio fin da ora chiunque abbia voglia di perdere un po' di tempo.


Come si installa e si configura FMDominoFileWatcher


1) copiare il contenuto del file Jaddin*.zip nella cartella Domino degli eseguibili
2) copiare il contenuto del file FMDominoFileWatcher*.zip nel medesimo percorso, avendo cura di lasciare i file nella subfolder fmWatchCompanion come sono nello zip
3) inserire in Notes.ini tante coppie di righe che indichino il percorso delle cartelle da monitorare e le sintassi dei rispettivi comandi da lanciare con la seguente sintassi, ad esempio:
FMwathcdir_Folder=c:\temp
FMwathcdir_Command=tell amgr run "names.nsf" 'agent1'
FMwathcdir_Folder1=\\nas4\public\Software
FMwathcdir_Command1=tell amgr run "tools\db2.nsf" 'agent2'
FMwathcdir_Folder2=c:\temp
FMwathcdir_Command2=tell amgr run "tools\db3.nsf" 'agent3'
Fare attenzione al fatto che su Windows il servizio Domino di default parte con diritti di LocalSystem e quindi non dispone del servizio di rete, pertanto non può vedere percorsi diversi dai dischi locali.
Se per caso servissero più di 20 (default) coppie "folder-command" si può impostare qualsiasi numero massimo con la sintassi {-varsMax n}, ad esempio:
-varsMax {200

4) Lancio esecuzione (attenzione al casing che in java è rilevante)
load runjava JAddin FMWatcher

5) debug. Si può impostare un debug elevato tramite due livelli di debug
debug di JAddin:
load runjava JAddin FMWatcher Debug!
debug di FMWatcher:
load runjava JAddin FMWatcher -debug
debug di entrambi:
load runjava JAddin FMWatcher Debug! -debug

6) Lancio all'avvio del server
Per avviare in automatico l'applicazione all'avvio del server è possibile aggiungere in notes.ini al termine della riga:
SERVERTASKS=xxxx,xxx,xxx,load runjava JAddin FMWatcher

Caveats


Può accadere che le modifiche alle cartelle da monitorare siano continue durante tutto il giorno e non si distanzino mai l'una dall'altra di 5 secondi. In questo caso il timer di attesa non scadrebbe mai, e potrebbe accadere che non venga ma lanciato il comando configurato.

Contatti

Francesco Marzolo
checco.marzolo (at) gmail
Se ti è piaciuto questo lavoro puoi regalarmi una pizza ai peperoni, della quale vado matto:
BTC:19qGMb33TPLn29UtBo3mFrRyr4ekAVYeaz
ETH:0xD2bF6c3d833b98C34AbCDfB4EA6022DAF48bc22F
LTC:Lh4r6QLsyaysHnS38FZ4qvqSDFcoTJJa7t

Bibliografia e riferimenti per chi vuole approfondire


Why it is important to use the Recycle() method on every Java object
http://www-01.ibm.com/support/docview.wss?uid=swg21097861

Sorgente del codice discusso in questo articolo
https://github.com/fmarzolo/FMDominoFileWatcher

Prerequisito
https://github.com/AndyBrunner/Domino-JAddin
http://abdata.ch

Take a Trip Into the Forest: A Java Primer on Maps, Trees, and Collections
https://youtu.be/Ln-meA0WXaw

Un altro esempio di utilizzo di WatchService tramite NIO
https://www.thecoderscorner.com/team-blog/java-and-jvm/java-nio/36-watching-files-in-java-7-with-watchservice/

Open Mic Webcast: Designing multi-threaded Domino Java applications
https://www-01.ibm.com/support/docview.wss?uid=swg27037716

Rust Language, mon amour! Stanford seminar
https://www.youtube.com/watch?v=O5vzLKg7y-k

0 Commenti:

    Nessun Commento Trovato
Commenta articolo
 

Questo spazio web è stato creato da per un uso pubblico e gratuito. Qualsiasi tipo di collaborazione sarà ben accetta.
Per maggiori informazioni, scrivete a info@dominopoint.it

About Dominopoint
Social
Dominopoint social presence: