使用Mule Enterprise Standalone 3.1.2我通过子类检测org.mule.routing.UntilSuccessful
的属性。我的子类用作自定义路由器。
<flow name="Queue Handler" processingStrategy="synchronous">
<inbound-endpoint ref="Some.Queue">
<vm:transaction action="ALWAYS_BEGIN"/>
</inbound-endpoint>
<custom-router class="com.company.product.mule.UntilSuccessfulSubclass">
<flow-ref name="SomeFlow" />
<spring:property name="objectStore" ref="SomeObjectStore" />
<spring:property name="maxRetries" value="${maxRetries}" />
<spring:property name="secondsBetweenRetries" value="${secondsBetweenRetries}" />
<spring:property name="deadLetterQueue" ref="Cancel.Queue" />
<spring:property name="maxThreads" value="${maxThreads}" />
<spring:property name="maxBufferSize" value="${maxBufferSize}" />
<spring:property name="threadTTL" value="${threadTTL}" />
</custom-router>
</flow>
目前我正在通过@ManagedAttribute
对我的子类UntilSuccessful的getter和setter进行曝光。
看看Mule核心xsd,似乎我没有选择传入bean而不是类。
我更喜欢使用Spring's MBeanExporter functionality,因为这样可以避免通过添加注释来更改我的类文件,更令人讨厌的是,必须覆盖超类方法,这样我才能检测JMX曝光。
答案 0 :(得分:2)
MuleSoft没有关于增强请求何时/是否会通过的消息。但是,MuleSoft的支持团队确实提供了一种解决方法:
在initialise()
中包含以下方法:
private void registerMBean()
{
final JmxSupportFactory jmxSupportFactory = AutoDiscoveryJmxSupportFactory.getInstance();
final JmxSupport jmxSupport = jmxSupportFactory.getJmxSupport();
final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
final String rawName = getName() + "(" + getType() + ")";
final String name = jmxSupport.escape(rawName);
final String jmxName = String.format("%s:%s%s", jmxSupport.getDomainName(muleContext, !muleContext.getConfiguration().isContainerMode()), "type=ODM,name=", name);
try
{
final ObjectName on = jmxSupport.getObjectName(jmxName);
final ClassloaderSwitchingMBeanWrapper mBean = new ClassloaderSwitchingMBeanWrapper(this, UntilSuccessfulMBean.class, muleContext.getExecutionClassLoader());
logger.debug("Registering custom router with name: " + on);
mBeanServer.registerMBean(mBean, on);
}
catch (final Exception e)
{
logger.error(e.getMessage());
}
}
此方法不需要对原始Mule配置文件进行任何更改(在我的原始帖子中部分引用)。
这种方法的一个缺点是我的MBean必须出现在骡子中。 JMX中的目录,而不是与该上下文之外的所有其他MBean分组,但它完成了工作。我没有足够的时间花在挖掘Mule的JMX软件包上,但它有可能。
答案 1 :(得分:0)
目前,Mule阻止将Spring bean直接用作自定义消息处理器,路由器...... IMO是一个疏忽:因为您是EE用户,您可能想要打开一张请求改进的票证。
以下是使用Spring配置UntilSuccessful
消息处理器时需要做的事情。我相信你可以将它应用到你自己的子类中。
<spring:beans>
<spring:bean id="untilSuccessful" class="org.mule.routing.UntilSuccessful">
<spring:property name="routes">
<util:list>
<spring:ref bean="flowToProcess" />
</util:list>
</spring:property>
<spring:property name="objectStore" ref="someObjectStore" />
<spring:property name="maxRetries" value="5" />
<spring:property name="secondsBetweenRetries" value="30" />
</spring:bean>
</spring:beans>
<flow name="test">
<vm:inbound-endpoint path="test.in"
exchange-pattern="one-way" />
<custom-processor class="com.myComp.MessageProcessorDelegate">
<spring:property name="delegate" ref="untilSuccessful" />
</custom-processor>
</flow>
package com.myComp;
import org.mule.api.MuleEvent;
import org.mule.api.MuleException;
import org.mule.api.processor.MessageProcessor;
import org.mule.processor.AbstractInterceptingMessageProcessor;
public class MessageProcessorDelegate extends AbstractInterceptingMessageProcessor
{
private MessageProcessor delegate;
public MuleEvent process(final MuleEvent event) throws MuleException
{
return delegate.process(event);
}
public void setDelegate(final MessageProcessor delegate)
{
this.delegate = delegate;
}
}