2

使用 Mule Enterprise Standalone 3.1.2 我正在检测org.mule.routing.UntilSuccessfulvia 子类的属性。我的子类用作自定义路由器。

<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我的直到成功的子类的 getter 和 setter 来检测曝光。

查看 Mule 核心 xsd,我似乎没有选择传入 bean 而不是类。

我更喜欢使用Spring 的 MBeanExporter 功能,因为这将允许我通过添加注释来避免更改我的类文件,更烦人的是,我必须重写超类方法,以便我可以检测 JMX 暴露。

4

2 回答 2

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 必须出现在 Mule 中。JMX 中的目录,而不是与该上下文之外的所有其他 MBean 分组,但它完成了工作。我没有花在挖掘 Mule 的 JMX 包上的点数,但这是可能的。

于 2013-07-19T14:56:39.927 回答
0

目前,Mule 阻止将 Spring bean 直接用作自定义消息处理器、路由器……这是 IMO 的疏忽:由于您是 EE 用户,您可能需要开一张票,要求对此进行改进。

这是您当前UntilSuccessful使用 Spring 配置消息处理器所需执行的操作。我相信您可以将其应用于您自己的子类。

<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;
    }
}
于 2013-06-06T17:30:25.237 回答