7

シードされたコレクションでクリーンな MongoDB データベースを作成する Java クラスがあります。データベースが欠落しているかどうかを自動的に識別して作成します。MuleEsb を起動するときにこれを実行したいと思います。こうすることで、ミュールを起動する前に呼び出すことを覚えておく必要がなくなります。フローの中に入れて、ラバの起動時に自動的にそのフローを1回実行したいと思っていました。

ミュールの起動時にこの1回限りの操作を行う方法はありますか?

- - アップデート - -

以下の会話に従って、以下をミュール構成に追加すると、フローが自動的にトリガーされます。

<quartz:connector name="Quartz" validateConnections="true"/>

<flow name="testService1">
    <quartz:inbound-endpoint name="runOnce" repeatCount="0" repeatInterval="1" jobName="job1" connector-ref="Quartz">
        <quartz:event-generator-job>
            <quartz:payload>foo</quartz:payload>
        </quartz:event-generator-job>
    </quartz:inbound-endpoint>

    <logger message="INBOUND HEADERS = #[headers:inbound:*]" level="WARN"/>
</flow>
4

2 に答える 2

12

このような機能をリクエストするために、1 か月前に JIRA を作成しました: http://www.mulesoft.org/jira/browse/MULE-6877

今のところ、トリックを使用できます:起動時にフローを 1 回だけトリガーするイベント ジェネレーター ジョブを含む Quartz インバウンド エンドポイント。 repeatCount = 0

または、コンテキスト イベントをリッスンし、特定のイベントがトリガーされたときにフローを呼び出すことができます。以下は、起動フローとシャットダウン フローを呼び出すリスナーを示しています。

package com.acme;

import org.mule.DefaultMuleEvent;
import org.mule.DefaultMuleMessage;
import org.mule.MessageExchangePattern;
import org.mule.api.MuleException;
import org.mule.api.MuleRuntimeException;
import org.mule.api.context.notification.MuleContextNotificationListener;
import org.mule.config.i18n.MessageFactory;
import org.mule.construct.Flow;
import org.mule.context.notification.MuleContextNotification;

public class FlowInvokingContextListener implements MuleContextNotificationListener<MuleContextNotification>
{
    private Flow startingFlow;
    private Flow stoppingFlow;

    public void onNotification(final MuleContextNotification notification)
    {
        if (notification.getAction() == MuleContextNotification.CONTEXT_STARTED)
        {
            sendNotificationToFlow(notification, startingFlow);
        }
        else if (notification.getAction() == MuleContextNotification.CONTEXT_STOPPING)
        {
            sendNotificationToFlow(notification, stoppingFlow);
        }
    }

    private void sendNotificationToFlow(final MuleContextNotification notification, final Flow flow)
    {
        try
        {
            final DefaultMuleEvent event = new DefaultMuleEvent(new DefaultMuleMessage(notification,
                notification.getMuleContext()), MessageExchangePattern.REQUEST_RESPONSE, startingFlow);
            flow.process(event);
        }
        catch (final MuleException me)
        {
            throw new MuleRuntimeException(MessageFactory.createStaticMessage("Failed to invoke: "
                                                                              + startingFlow), me);
        }
    }

    public void setStartingFlow(final Flow startingFlow)
    {
        this.startingFlow = startingFlow;
    }

    public void setStoppingFlow(final Flow stoppingFlow)
    {
        this.stoppingFlow = stoppingFlow;
    }
}

以下で構成:

<spring:beans>
    <spring:bean name="flowInvokingContextListener"
        class="com.acme.FlowInvokingContextListener"
        p:startingFlow-ref="startFlow" p:stoppingFlow-ref="stopFlow" />
</spring:beans>

<notifications>
    <notification event="CONTEXT" />
    <notification-listener ref="flowInvokingContextListener" />
</notifications>
于 2013-07-03T23:56:41.940 に答える