submarine.core
Interface PoolingFunction

All Superinterfaces:
XMLConfigurable
All Known Subinterfaces:
PoolingFunctionWithContext
All Known Implementing Classes:
TimerFunction, PoolerPageInvoker, BasePoolerPage

public interface PoolingFunction
extends XMLConfigurable

Cette interface est implémentée par des classes qui doivent vérifier à fréquence régulière de la présence de nouveaux messages à transmettre au Systeme EAI.
Par exemple on peut imaginer un JDBCConnector qui vérifierait à fréquence régulière de la présence de nouvels enregistrements dans une base avant de les envoyer au Systeme EAI.
Autre exemple, Un HTTPConnector qui requêtrait à fréquence régulière sur une URL jusqu'à ce qu'une nouvelle réponse soit fournie.

Quand utiliser ? :

Seul EAISystem utilise cette interface pour initialiser les PoolingFunctions définies dans la configuration, puis les lancer dans un Thread (voir création d'une PoolingFunction, et lancement d'une PoolingFunction.
Voici comment l'EAISystem utilise cette interface dans la classe RunPoolingFunction:
 while( !interrupted ) {
 	try {
 		if( pf.hasNewDocument() ) {
 			Object o,r;
 			while( (o=pf.getNextDocument())!=null ) {
 				r=eai.submit(o, pf.getRouteInfos() );
 				boolean nok=(r instanceof Exception);
 				pf.notifyResponse(o,r,!nok);
 			}
 		}
 	} catch( Exception e ) {  ignore cette requette }
 	if( !interrupted ) try {
 		Thread.sleep(pf.getFrequency());
 	} catch( InterruptedException ie) {
 		interrupted=true;
 	}
 }
 

Quand implémenter ? :

Cette interface doit être implémentée si vous devez effectuer un connecteur sur un système tiers qui ne permet pas de notification ou qui doit être interrogé pour obtenir une nouvelle information. Dans d'autre cas vous préfèrerez ListeningFunction.
Cette interface hérite de XMLConfigurable pour son initialisation à partir d'un élément XML. Le schéma XML de l'initialisation est totalement libre, elle doit seulement être limitée à cet élément et à ses descendants.
L'implémentation de cette interface n'a pas nécessairement de référence sur l'EAISystem. En effet c'est ce dernier qui intérroge et gère les fréquences des requettes sur le tiers.
L'implémentation ce cette interface passe principalement par l'implémentation de hasNewDocument() et getNextDocument(). Une instance de PoolingFunction n'est pas utilisée de manière multi threadée. Cette instance a donc le loisir d'initialiser des variables internes lors de l'appel à hasNewDocument et de les utiliser sans risque lors des appels successifs à getNextDocument.


Method Summary
 long getFrequency()
          Fournit La durée pendant laquelle l'EAIsystem doit attendre avant de renouveller les appels.
 java.lang.Object getNextDocument()
          Retourne le document suivant de la liste initialisé lors de l'appel à hasNewDocument().
L'implémentation de cette méthode ne doit pas être bloquante.
 RouteInfos getRouteInfos()
          Fournit les informations de routage pour le dernier document lu par getNextDocument.
 boolean hasNewDocument()
          La PoolingFunction a-elle de nouveaux documents à soumettre au Systeme EAI ?
 void notifyResponse(java.lang.Object doc, java.lang.Object response, boolean ok)
          Notifie la PoolingFunction que la soumission de l'objet doc a eu lieu et que la réponse est response.
 
Methods inherited from interface submarine.core.XMLConfigurable
init
 

Method Detail

hasNewDocument

public boolean hasNewDocument()
La PoolingFunction a-elle de nouveaux documents à soumettre au Systeme EAI ?
Appelée après chaque réveil de la PoolingFunction, l'implémentation de cette méthode doit permettre de vérifier auprès du tiers si des documents sont disponibles.
Returns:
boolean Retourne Vrai si et seulement si au moins un appel à getNextDocument() ne retournera pas null.

getNextDocument

public java.lang.Object getNextDocument()
                                 throws java.lang.Exception
Retourne le document suivant de la liste initialisé lors de l'appel à hasNewDocument().
L'implémentation de cette méthode ne doit pas être bloquante.
Returns:
java.lang.Object Retourne le nouvel objet java représentant le message. Retourne null si le dernier message a déjà été lu.
Throws:
java.lang.Exception - Si une exception est levée lors de l'exécution de cette méthode, le processus d'interrogation s'interrompt.

getFrequency

public long getFrequency()
Fournit La durée pendant laquelle l'EAIsystem doit attendre avant de renouveller les appels.
Cette fréquence peut être fixe ou bien variable selon le besoin du connecteur.
Returns:
long La durée pendant laquelle l'EAISystem va attendre en millisecondes.

getRouteInfos

public RouteInfos getRouteInfos()
Fournit les informations de routage pour le dernier document lu par getNextDocument.
Ces informations peuvent être systématiquement identique, dans ce cas, la même instance de RouteInfos peut être utilisée. Si ces informations dépendent du message (routage en fonction du contenu), une instance spécifique devra être fournie.
Returns:
submarine.core.RouteInfos Les informations de routage.

notifyResponse

public void notifyResponse(java.lang.Object doc,
                           java.lang.Object response,
                           boolean ok)
Notifie la PoolingFunction que la soumission de l'objet doc a eu lieu et que la réponse est response.
Le paramètre ok, indique si une erreur s'est produite lors le la soumission du message.
Parameters:
doc - L'objet Java ayant été retourné par le précedent appel à getNextDocument.
response - La réponse de la soumission du message au Systeme EAI. Voir EAISystem.submit(java.lang.Object, submarine.core.RouteInfos, submarine.core.Message.MsgContext).
ok - Vrai si la soumission s'est passée sans erreur, et faut si une exception s'est produite. Si la soumission était asynchrone, ok n'indique pas si le traitement du message s'est bien passé mais seulement qu'il a bien été inséré dans la file d'attente.

Submarine project. free distribution of this software must include the opensource licence.
Guénolé de Cadoudal.