我是WSO2 ESB的新手,我正在尝试做一些初步的实验来构建一个自定义消息处理器。我基本上创建了一个项目,在其中定义了一个扩展 WSO2 SamplingProcessor抽象类的类。这是一个非常简约的实验,所以此时我只是覆盖了一些方法,将一些日志放入其中。
看来我的应用程序工作正常,并且使用了这个自定义消息处理器,我无法将插入的日志读入我的wso2carbon.log日志文件。
我已经这样做了:
1) 我创建了一个新的 Maven 项目,并使用了这个pom.xml文件,它应该符合构建自定义消息处理器的要求:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.mycompany.toolkit</groupId>
<artifactId>SamplingProcessorHeaderRateLimitation</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>bundle</packaging>
<name>Sampling Processor Header Rate Limitation</name>
<description>Custom Sampling Mesageprocessor using response header to implement the rate limitation</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.4</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>com.mycompany.toolkit.messageprocessor</Bundle-SymbolicName>
<Bundle-Name>com.mycompany.toolkit.messageprocessor</Bundle-Name>
<Export-Package>com.mycompany.toolkit.*</Export-Package>
<DynamicImport-Package>*</DynamicImport-Package>
<Implementation-Build>${buildNumber}</Implementation-Build>
<Scm-Root>${project.scm.connection}</Scm-Root>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<releases>
<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>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<id>wso2-nexus</id>
<url>http://maven.wso2.org/nexus/content/groups/wso2-public/</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.apache.synapse</groupId>
<artifactId>synapse-core</artifactId>
<version>2.1.7-wso2v3</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<properties>
<CApp.type>lib/synapse/mediator</CApp.type>
</properties>
</project>
2) 然后我创建了这个SamplingProcessorHeaderRateLimitation这是我的自定义消息处理器实现,它扩展了SamplingProcessor WSO2 消息处理器类:
package com.mycompany.toolkit.messageprocessor;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseException;
import org.apache.synapse.core.SynapseEnvironment;
import org.apache.synapse.message.processor.impl.ScheduledMessageProcessor;
import org.apache.synapse.message.processor.impl.sampler.SamplingProcessor;
import org.apache.synapse.message.processor.impl.sampler.SamplingProcessorView;
public class SamplingProcessorHeaderRateLimitation extends SamplingProcessor {
private static final Log logger = LogFactory.getLog(ScheduledMessageProcessor.class.getName());
private SamplingProcessorView view;
@Override
public void init(SynapseEnvironment se) {
super.init(se);
logger.info("init() START");
System.out.println("init() START");
try {
view = new SamplingProcessorView(this);
} catch (Exception e) {
throw new SynapseException(e);
}
// register MBean
org.apache.synapse.commons.jmx.MBeanRegistrar.getInstance().registerMBean(view,
"Message Sampling Processor view", getName());
logger.info("init() END");
System.out.println("init() END");
}
@Override
public void setParameters(Map<String, Object> parameters) {
logger.info("setParameters() START");
System.out.println("setParameters() START");
// TODO Auto-generated method stub
super.setParameters(parameters);
logger.info("setParameters() END");
System.out.println("setParameters() END");
}
}
如您所见,我正在覆盖一些方法,例如init()(因为我认为它执行一次,但何时执行?)和setParameters()(出于相同的原因)。
如您所见,我尝试使用Log logger实例放置日志,但也使用简单的System.out.println()。
我构建它生成 jar 文件,并将这个 jar 上传到WSO2 EI管理面板中:ESB Artifacts --> Add。
然后我尝试在我的 ESB 应用程序中使用这个自定义消息处理器,以这种方式配置这个消息处理器:
<?xml version="1.0" encoding="UTF-8"?>
<!---<messageProcessor class="org.apache.synapse.message.processor.impl.sampler.SamplingProcessor" messageStore="transferFromMessageStore" name="transferFromMessageProcessor" xmlns="http://ws.apache.org/ns/synapse">-->
<messageProcessor class="com.mycompany.toolkit.messageprocessor.SamplingProcessorHeaderRateLimitation" messageStore="transferFromMessageStore" name="transferFromMessageProcessor" xmlns="http://ws.apache.org/ns/synapse">
<parameter name="sequence">transferProcessorSequence</parameter>
<parameter name="interval">1000</parameter>
<parameter name="is.active">true</parameter>
<parameter name="concurrency">1</parameter>
</messageProcessor>
如您所见,我将标准org.apache.synapse.message.processor.impl.sampler.SamplingProcessor消息处理器(此 ESB 应用程序以前使用过)替换为我的自定义消息处理器(com.mycompany.toolkit.messageprocessor.SamplingProcessorHeaderRateLimitation)。
我的应用程序似乎工作正常(所以我认为它正在使用这个自定义消息处理器,我希望如此)但是插入到init()和setParameters()方法的日志没有打印到我的日志文件(wso2carbon.log)中。
为什么?可能是什么问题?我错过了什么?
我在调用 WSO2 ESB API 之后检查日志,所以我只能看到调用 API 之后发生的情况(我在日志上执行 unix tail)。
这两个被覆盖的方法是否仅在 Carbon 服务器启动时或部署 ESB 应用程序时执行?
最终我可以覆盖什么消息处理器方法来测试日志?(我的意思是每次我的自定义消息处理器执行其相关序列时调用的方法)