启动后如何阻止骡子流量的运行

时间:2013-03-13 14:12:40

标签: jms mule endpoint connector

我有一个以jms入站端点开头的骡子流。 我的要求是在明确启用端点的连接器之前阻止队列读取任何消息。 所以我有一个初始化器实现MuleContextNotificationListener,覆盖onNotification,如下所示:

@Override
public void onNotification(MuleContextNotification ctxNotification) {

    System.out.println("Notification order event: " + ctxNotification.getActionName() );


    if(ctxNotification.getAction() == MuleContextNotification.CONTEXT_STARTING
            || ctxNotification.getAction() == MuleContextNotification.CONTEXT_STARTED){
        try{
            //Startup with the Staging and Error Q readers disabled.
            System.out.println("STOPPING QUEUES : Staging and Error Queues");
            //ctxNotification.getMuleContext().getRegistry().lookupConnector("lynxJMSConnectorStagingQReaderNormal").stop();
            ctxNotification.getMuleContext().getRegistry().lookupConnector("lynxJMSConnectorStagingQReaderDR").stop();
            ctxNotification.getMuleContext().getRegistry().lookupConnector("lynxJMSConnectorErrorQReader").stop();
            ctxNotification.getMuleContext().getRegistry().lookupEndpointFactory().getInboundEndpoint("errorQueueReader").stop();

            System.out.println("STOPPED QUEUES");

        }catch(MuleException me){
            me.printStackTrace();
        }
    }

}

但即使应用程序正在初始化,流程仍会启动(从jms队列中读取消息)。当连接器初始化时我该怎么做来拦截所以我可以阻止它?如果没有,我应该使用什么机制来阻止连接器读取它。我已经有了从http调用启动/停止连接器的代码。

我正在使用没有注释的Mule 3.2.2。

谢谢,

2 个答案:

答案 0 :(得分:3)

在初始化阶段尝试停止流程,而不是在Mule启动时将其配置为停止:

<flow name="..." initialState="stopped">

然后让你的自定义逻辑在时间良好时启动它,例如使用MEL:

<expression-component>app.registry.targetFlow.start();</expression-component>

答案 1 :(得分:1)

或者,有一个名为 mule-deploy.properties 的属性文件 你可以在那里找到所有的流xml文件名都是手动写的: -

config.resources=yourFlowName.xml

您可以删除在Mule应用程序启动时不想启动的流程名称。
但是,建议使用David的解决方案,并且您应该仅将此解决方案用作替代方案。