将类属性暴露给JMX for Mule自定义路由器:我的选择是什么?

时间:2013-06-06 16:33:44

标签: mule spring-jmx

使用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曝光。

2 个答案:

答案 0 :(得分:2)

MuleSoft没有关于增强请求何时/是否会通过的消息。但是,MuleSoft的支持团队确实提供了一种解决方法:

  • 创建定义要在JMX中公开的方法的界面
  • 在UntilSuccessfulSubclass中实现接口
  • 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;
    }
}