Passer au contenu principal

Comment créer un gestionnaire de synapse | Intégrateur de WSO2

Dans ce tutoriel, nous expliquons étape par étape comment créer un gestionnaire Synapse avec WSO2 Enterprise Integrator.

Qu’est-ce qu’un gestionnaire de synapse personnalisé?

Un gestionnaire de synapse personnalisé peut être utilisé pour traiter chacune des demandes de manière personnalisée. Le gestionnaire permet d’enregistrer les rappels des événements suivants:

  • Request in flow: Il est exécuté lorsque la requête entre à Synapse
public boolean handleRequestInFlow(MessageContext messageContext);
  • Request out flow: Il est exécuté lorsque la requête sort de Synapse
public boolean handleRequestOutFlow(MessageContext messageContext);
  • Response in flow: Il est exécuté lorsque la requête entre à Synapse
public boolean handleResponseInFlow(MessageContext messageContext);
  • Response out flow: Il est exécuté lorsque la requête  sort de Synapse
public boolean handleResponseOutFlow(MessageContext messageContext);

Comment créer un gestionnaire de synapse

1.Pour créer un gestionnaire Synapse, vous devez créer un nouveau projet et ajouter les dépendances Maven suivantes:

<repositories>
    <repository>
        <id>wso2-nexus</id>
        <name>WSO2 internal Repository</name>
        <url>http://maven.wso2.org/nexus/content/groups/wso2-public/</url>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
            <checksumPolicy>ignore</checksumPolicy>
        </releases>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>org.apache.synapse</groupId>
        <artifactId>synapse-core</artifactId>
        <version>2.1.7-wso2v143</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.axis2.wso2</groupId>
        <artifactId>axis2</artifactId>
        <version>1.6.1-wso2v41</version>
    </dependency>
</dependencies>

2. Une fois les dépendances résolues, nous étendons la classe org.apache.synapse.AbstractSynapseHandler et nous créons les callbacks nécessaires:

public class CustomHandler extends AbstractSynapseHandler {
    private final static Log log = LogFactory.getLog(CustomHandler.class);

    public boolean handleRequestInFlow(MessageContext messageContext) {
        if (log.isDebugEnabled()) {
            log.info("handleRequestInFlow");
        }
        
        return true;
    }

    public boolean handleRequestOutFlow(MessageContext messageContext) {
        if (log.isDebugEnabled()) {
            log.info("handleRequestOutFlow");
        }

        return true;
    }

    public boolean handleResponseInFlow(MessageContext messageContext) {
        if (log.isDebugEnabled()) {
            log.info("handleResponseInFlow");
        }
        
        return true;
    }

    public boolean handleResponseOutFlow(MessageContext messageContext) {
        if (log.isDebugEnabled()) {
            log.info("handleResponseOutFlow");
        }
        
        return true;
    }
}

3.Nous compilons le projet à l’aide de la commande suivante:

mvn clean install

Installation du gestionnaire Synapse

1.À la fin de la compilation, nous copions le fichier jar généré dans le dossier lib dans Enterprise Integrator ou Micro Integrator:

cp ${HANDLER_HOME}/target/com.chakray.integrator.handler-1.0.jar ${INTEGRATOR}/lib

2.Pour activer le gestionnaire personnalisé, nous modifions le fichier ${INTEGRATOR}/conf/synapse-handlers.xml et on ajoute la ligne suivante:

<handler name="CustomHandler" class="com.chakray.integrator.handler.CustomHandler"/>

3. On ajoute les loggers correspondants en ajoutant au fichier ${INTEGRATOR}/conf/log4j2.properties las siguientes líneas:

loggers = custom-handler, AUDIT_LOG...
...
logger.custom-handler.name=com.chakray.integrator.handler.CustomHandler
logger.custom-handler.level=DEBUG

4. Après avoir appliqué tous les changements, nous démarrons Integrator. Pour chaque demande que nous faisons, nous verrons les logs placés dans chacun des rappels:

Utilisations du “Handler”

Headers ou En-têtes

Une des utilisations que l’on peut donner aux gestionnaires est de lire, modifier ou supprimer les en-têtes lors de la requête.

  • Lire les en-têtes de la requête dans le flux handleRequestInFlow:
org.apache.axis2.context.MessageContext axis2MessageContext = ((Axis2MessageContext) messageContext)
    .getAxis2MessageContext();

// Lire les en-têtes de la requête
Object headers = axis2MessageContext
    .getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);

log.info("Headers from request");

for (Object header: ((Map) headers).entrySet()) {
    log.info(header);
}

  • Ajouter un nouvel en-tête / cookie (JSESSIONID) à la réponse dans le fluxhandleResponseOutFlow:
org.apache.axis2.context.MessageContext axis2MessageContext = ((Axis2MessageContext) messageContext)
    .getAxis2MessageContext();

// Ajouter un nouvel en-tête à la réponse
Map headers = (Map) axis2MessageContext.getProperty(
    org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS
);

String session = Constants.SESSION_COOKIE_JSESSIONID + "=" + System.currentTimeMillis();
headers.put("Cookie", session);

messageContext.setProperty(
    org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS, headers
);

log.info("Headers from response");
for (Object header: ((Map) axis2MessageContext.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS) ).entrySet()) {
    log.info(header);
}

Body ou Corps

Une autre utilisation possible du gestionnaire est de lire ou de modifier le corps de la demande ou de la réponse

  • Lire le corps de la requête dans le flux handleRequestOutFlow:
try {
    RelayUtils.buildMessage(((Axis2MessageContext) messageContext).getAxis2MessageContext());
} catch (Exception e) {
    log.error(e.getMessage());
}

// Lire la demande de corps
log.info("Body from request");
log.info(
    messageContext.getEnvelope().getBody().toString()
);

OMElement ns = messageContext.getEnvelope().getBody().getFirstElement();

log.info("Parameters from request");
if (ns != null) {
    Iterator parameters = ns.getChildElements();
    while (parameters.hasNext()) {
        OMElement param = (OMElement) parameters.next();
        log.info("Key: " + param.getQName());
        log.info("Value: " + param.getText());
    }
}

  • Modifiez le corps de la réponse, dans cet exemple nous consommons un service qui renvoie tous les attributs d’un utilisateur et le gestionnaire remplace le mot de passe de l’utilisateur par “*****” Ex :
try {
    RelayUtils.buildMessage(((Axis2MessageContext) messageContext).getAxis2MessageContext());
} catch (Exception e) {
    log.error(e.getMessage());
}

// Lire la réponse du corps
log.info("Body from response");
log.info(
    messageContext.getEnvelope().getBody().toString()
);

OMElement ns = messageContext.getEnvelope().getBody().getFirstElement();

log.info("Parameters from response");
if (ns != null) {
    Iterator parameters = ns.getChildElements();
    while (parameters.hasNext()) {
        OMElement param = (OMElement) parameters.next();
        Iterator it = param.getChildElements();

        while (it.hasNext()) {
            OMElement attribute = (OMElement) it.next();
            log.info("Attribute: " + attribute.getLocalName());
            log.info("Value: " + attribute.getText());

            String localName = attribute.getLocalName();
            // Remplacez le mot de passe de l'utilisateur par ***
            if (localName.equals("UM_USER_PASSWORD") ||
            localName.equals("UM_SALT_VALUE")) {
                attribute.setText("*****");
            }
        }
    }
}