Calling a Sequence using custom class mediator in WSO2 ESB
[Article moved from ajanthane.blogspot.com]
This article shows how to call a sequence using a class mediator. In some occasions we need to route message to different sequences inside custom class mediator, in this case we can use the below implementation to handle it.
Create a Sequence in WSO2 ESB. The sample sequence used is as below:
<sequence name="TestSequence" xmlns="http://ws.apache.org/ns/synapse">
<log level="custom">
<property name="STATUS:" value="--------------TestSequence Invoked---------------"></property>
</log>
</sequence>
Then create and build the below class to call the sequence-TestSequence inside class mediator. Then copy the build jar to ESB_HOME/repository/components/lib.
package com.custom.sequence.router;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.Mediator;
import org.apache.synapse.MessageContext;
import org.apache.synapse.mediators.AbstractMediator;
public class CustomSequenceRouter extends AbstractMediator {
private static final Log log = LogFactory
.getLog(CustomSequenceRouter.class);
private String sequenceKey; // This value can set as property for class
// mediator in synapse configuration
public boolean mediate(MessageContext context) {
log.info("-------------------Invoking Custom Mediate to Route Sequence------------");
// Call the Sequence
Mediator callSequenceMediator = null;
if (sequenceKey != null) {
callSequenceMediator = context.getSequence(sequenceKey);
} else {
if (log.isDebugEnabled()) {
log.debug("Sequence Key not specified.");
}
}
callSequenceMediator.mediate(context);
return true;
}
public String getSequenceKey() {
return sequenceKey;
}
public void setSequenceKey(String sequenceKey) {
this.sequenceKey = sequenceKey;
}
}
The pom.xml of the project is given below:
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelversion>4.0.0</modelversion>
<groupid>com.custom.sequence.router.CustomSequenceRouter</groupid>
<artifactid>CustomSequenceRouter</artifactid>
<version>1.0.0</version>
<packaging>bundle</packaging>
<name>CustomSequenceRouter</name>
<description>CustomSequenceRouter</description>
<properties>
<capp .type="">lib/synapse/mediator</capp>
</properties>
<dependencies>
<dependency>
<groupid>org.apache.axis2.wso2</groupid>
<artifactid>axis2</artifactid>
<version>1.6.1.wso2v14</version>
</dependency>
<dependency>
<groupid>org.apache.woden.wso2</groupid>
<artifactid>woden</artifactid>
<version>1.0.0.M9-wso2v1</version>
</dependency>
<dependency>
<groupid>commons-httpclient.wso2</groupid>
<artifactid>commons-httpclient</artifactid>
<version>3.1.0.wso2v2</version>
</dependency>
<dependency>
<groupid>commons-codec.wso2</groupid>
<artifactid>commons-codec</artifactid>
<version>1.4.0.wso2v1</version>
</dependency>
<dependency>
<groupid>wsdl4j.wso2</groupid>
<artifactid>wsdl4j</artifactid>
<version>1.6.2.wso2v4</version>
</dependency>
<dependency>
<groupid>org.apache.abdera.wso2</groupid>
<artifactid>abdera</artifactid>
<version>1.0.0.wso2v3</version>
</dependency>
<dependency>
<groupid>org.apache.geronimo.specs.wso2</groupid>
<artifactid>geronimo-stax-api_1.0_spec</artifactid>
<version>1.0.1.wso2v2</version>
</dependency>
<dependency>
<groupid>org.apache.neethi.wso2</groupid>
<artifactid>neethi</artifactid>
<version>2.0.4.wso2v4</version>
</dependency>
<dependency>
<groupid>org.apache.synapse</groupid>
<artifactid>synapse-core</artifactid>
<version>2.1.3-wso2v11</version>
</dependency>
<dependency>
<groupid>org.apache.ws.commons.schema.wso2</groupid>
<artifactid>XmlSchema</artifactid>
<version>1.4.7.wso2v3</version>
</dependency>
<dependency>
<groupid>org.apache.httpcomponents.wso2</groupid>
<artifactid>httpcore</artifactid>
<version>4.3.3.wso2v1</version>
</dependency>
<dependency>
<groupid>commons-logging</groupid>
<artifactid>commons-logging</artifactid>
<version>1.1.1</version>
</dependency>
<dependency>
<groupid>commons-io.wso2</groupid>
<artifactid>commons-io</artifactid>
<version>2.0.0.wso2v2</version>
</dependency>
</dependencies>
<repositories>
<repository>
<releases>
<enabled>true</enabled>
<updatepolicy>daily</updatepolicy>
<checksumpolicy>ignore</checksumpolicy>
</releases>
<id>wso2-nexus</id>
<url>http://maven.wso2.org/nexus/content/groups/wso2-public/</url>
</repository>
</repositories>
<pluginrepositories>
<pluginrepository>
<releases>
<enabled>true</enabled>
<updatepolicy>daily</updatepolicy>
<checksumpolicy>ignore</checksumpolicy>
</releases>
<id>wso2-nexus</id>
<url>http://maven.wso2.org/nexus/content/groups/wso2-public/</url>
</pluginrepository>
</pluginrepositories>
<build>
<plugins>
<plugin>
<groupid>org.apache.felix</groupid>
<artifactid>maven-bundle-plugin</artifactid>
<version>2.3.4</version>
<extensions>true</extensions>
<configuration>
<instructions>
<bundle-symbolicname>CustomSequenceRouter</bundle-symbolicname>
<bundle-name>CustomSequenceRouter</bundle-name>
<export-package>com.custom.sequence.router</export-package>
<dynamicimport-package>*</dynamicimport-package>
</instructions>
</configuration>
</plugin>
<plugin>
<artifactid>maven-eclipse-plugin</artifactid>
<version>2.9</version>
<configuration>
<buildcommands>
<buildcommand>org.eclipse.jdt.core.javabuilder</buildcommand>
</buildcommands>
<projectnatures>
<projectnature>org.wso2.developerstudio.eclipse.artifact.mediator.project.nature
</projectnature>
<projectnature>org.eclipse.jdt.core.javanature</projectnature>
</projectnatures>
</configuration>
</plugin>
</plugins>
</build>
</project>
Create a proxy service to call the class mediator in the message flow. Sample proxy service is given below. Here the sequence name to be called is given as a property in class mediator. this helps to dynamically specify the sequence name and inject into the custom class mediator.
<proxy name="SequenceRouterProxy" startonload="true" statistics="disable" trace="disable" transports="https,http" xmlns="http://ws.apache.org/ns/synapse">
<target>
<insequence>
<log level="custom">
<property name="STATUS:" value="----------------------SequenceRouterProxy Invoked-------------">
</property></log>
<class name="com.custom.sequence.router.CustomSequenceRouter">
<property name="sequenceKey" value="TestSequence">
</property></class>
</insequence>
</target>
<description>
</description></proxy>