Rubrique précédente: Ajout de balises à des trames de transactionRubrique suivante: Extension Java de VSE


Extension de l'intermédiaire

Les extensions d'intermédiaire sont chargées et appelées par l'intermédiaire lorsqu'un agent envoie un fragment de transaction.

Les extensions d'intermédiaire permettent d'effectuer les opérations suivantes :

Pour étendre l'intermédiaire, implémentez l'interface com.itko.lisa.remote.plumbing.IAssemblyExtension. Cette interface définit la méthode onTransactionReceived(). Pour de plus amples informations, reportez-vous au document JavaDocs disponible dans le dossier doc du répertoire d'installation.

public interface IAssemblyExtension {
     /**
      * Méthode appelée avant l'assemblage
      * @param frame Racine de transaction partielle envoyée par un agent
      * @return renvoie la valeur True pour omettre l'assemblage normal (si l'extension veut la traiter).
      */
     public boolean onTransactionReceived(TransactionFrame frame);
 }

Pour déployer une extension d'intermédiaire, compilez l'extension et mettez-la en package dans un fichier .jar avec un fichier manifeste contenant l'entrée suivante :

Broker-Extension: nom de la classe d'extension 

Lorsque vous déplacez ce fichier .jar dans le répertoire (registre) de l'intermédiaire, celui-ci le récupère automatiquement. Si vous ajoutez le fichier après le démarrage de l'intermédiaire (registre), un mécanisme de chargement à chaud permet d'assurer l'application du fichier. Si vous mettez à jour l'extension .jar lors de l'exécution de l'intermédiaire (registre), les classes JAR seront rechargées de façon dynamique. Le rechargement dynamique simplifie et accélère le test de votre code d'extension sans redémarrer l'intermédiaire (registre).

 

Exemple

Exemple d'utilisation habituelle : l'algorithme d'assemblage normal utilisant des TCP/IP et des ports est confondu par un équilibreur de charge placé entre des agents et une adresse IP virtuelle lui est affectée, ou des agents utilisent une bibliothèque native en tant qu'E/S et l'accès direct aux adresses IP et aux ports en cours d'utilisation n'est pas disponible. Dans ce cas, les champs d'adresse et de port des trames sont vides ou incorrects et les trames doivent être assemblées dans une extension :

import com.itko.lisa.remote.plumbing.IAssemblyExtension;
import com.itko.lisa.remote.transactions.TransactionFrame;
import com.itko.lisa.remote.utils.Log;
import com.itko.lisa.remote.utils.UUID;
 
public class LoadBalancerExtension implements IAssemblyExtension {
 
    private TransactionFrame m_lastAgent1Frame;
    private TransactionFrame m_lastAgent2Frame;
 
    public boolean onTransactionReceived(TransactionFrame frame) {
 
    if (frame.getClassName().equals("Class1") && frame.getMethod().equals("method1")) {
        m_lastAgent2Frame = frame;
        if (m_lastAgent1Frame.getFrameId() == m_lastAgent2Frame.getParentId()) {
            stitch(m_lastAgent1Frame, m_lastAgent2Frame);
        }
    }
 
    if (frame.getClassName().equals("Class2") && frame.getMethod().equals("method2")) {
        m_lastAgent1Frame = frame;
        if (m_lastAgent1Frame.getFrameId() == m_lastAgent2Frame.getParentId()) {
            stitch(m_lastAgent1Frame, m_lastAgent2Frame);
        }
    }
 
        return false;
    }
 
    private void stitch(TransactionFrame parent, TransactionFrame child) {
    String newFrameId = UUID.newUUID();
    parent.setFrameId(newFrameId);
    child.setParent(parent);
    parent.getChildren().add(child);
}
}