我有一个以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。
谢谢,
答案 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的解决方案,并且您应该仅将此解决方案用作替代方案。