我是 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文件,我在 WSO2 EI 管理面板中上传了这个jar: ESB Artifacts - &gt;添加
然后我尝试在我的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()< / strong>方法未打印到我的日志文件中( wso2carbon.log )。
为什么呢?可能是什么问题?我错过了什么?
我之后检查了日志,我调用了我的WSO2 ESB API,所以我只能看到调用API后发生的事情(我在日志上做了一个unix尾部)。
这两个覆盖方法可能只在Carbon服务器启动时或部署ESB应用程序时执行?
最终我可以覆盖什么消息处理器方法来测试日志? (我的意思是每次我的自定义消息处理器执行其相关序列时调用的方法)
答案 0 :(得分:1)
我认为它执行了一次,但是什么时候? - 在初始化期间,我认为当你编辑一些MessageProcessor并按下保存按钮时会发生这种情况,你会发现类似
的内容[2017-07-20 13:45:41,477] [] INFO - ScheduledMessageProcessor Started message processor. [meneriade]
关于记录
logger.info("init() START");
你检查过log4j.properties吗?您有自定义包名称
package com.mycompany.toolkit.messageprocessor;