在主/从或故障转移关系中使用Mule实例

时间:2014-05-05 14:32:03

标签: mule

我有两个Mule实例在队列中订阅了相同的主题,但我只想让每条消息都消耗一次。

我可以通过将消息汇集到唯一队列并从那里进行处理来实现这一点,但是为了降低操作复杂性,我想设置在每个Mule实例上运行的消息使用者流以遵循其中一个实例。

这类似于ActiveMQ故障转移设置(其中一次只运行一个实例而空闲实例仅在正在运行的实例无法响应时唤醒)或主/从配置,其中我将授予其中一个实例命令超过其他人。或者像实例间而不是实例内的VM传输。

这需要使用Mule版本3.4在没有任何Mule Enterprise Edition组件(仅依赖于Mule Community Edition组件)的情况下完成。或3.5。

1 个答案:

答案 0 :(得分:0)

我无法找到方便的内置方法来执行此操作。相反,我假设每个mule实例将在一个单独的框上运行,并使用server.host值来确定处理哪个实例:

<mule xmlns:redis="http://www.mulesoft.org/schema/mule/redis" 
    xmlns="http://www.mulesoft.org/schema/mule/core"  
    version="CE-3.5.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/redis http://www.mulesoft.org/schema/mule/redis/3.4/mule-redis.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd">

    <!-- define redis instance -->
    <redis:config name="redis-instance" />

    <flow name="topicConsumer">
        <!-- listen to redis channel (topic) -->
        <redis:subscribe config-ref="redis-instance">
            <redis:channels>
                <redis:channel>topic.channel</redis:channel>
            </redis:channels>
        </redis:subscribe>

        <!-- save original payload (message from Redis) -->
        <set-session-variable variableName="redisPayload" value="#[payload]" />

        <!-- select processor -->
        <flow-ref name="topicProcessorSelector"/>

        <choice>
            <when expression="#[sessionVars['subscriberProcessor'] == server.host]">
                <logger level="INFO" message="processing on #[server.host]"/>
            </when>
            <otherwise>
                <logger level="INFO" message="take no action"/>
            </otherwise>
        </choice>
    </flow>

    <flow name="topicProcessorSelector" processingStrategy="synchronous">
        <!-- get key -->
        <redis:get config-ref="redis-instance" 
            key="topic_processor"/>

        <!-- if no key, then add this instance as the processor -->
        <choice>
            <when expression="#[payload instanceof org.mule.transport.NullPayload]">
                <!-- set key -->
                <redis:set config-ref="redis-instance" 
                    key="topic_processor"
                    expire="10"
                    value="#[server.host]">
                </redis:set>
                <set-session-variable variableName="subscriberProcessor" value="#[server.host]" />
            </when>
            <otherwise>
                <!-- use existing key -->
                <byte-array-to-string-transformer/>
                <set-session-variable variableName="subscriberProcessor" value="#[payload]" />
            </otherwise>
        </choice>
    </flow>
</mule>