【问题标题】:How to run a flow once, automatically when starting mule?启动mule时如何自动运行一次流程?
【发布时间】:2022-04-05 22:59:08
【问题描述】:

我有一个 java 类,它使用种子集合创建一个干净的 MongoDB 数据库。它会自动识别数据库是否丢失并创建它。我想在启动 MuleEsb 时运行它。这样我就不需要记住在启动 mule 之前调用它。我希望将它放在一个流中并在 mule 启动时自动运行一次该流。

有没有办法在 mule 启动时做这个一次性操作?

--- 更新---

根据下面的对话,我将以下内容添加到我的 mule 配置中,流程会自动触发。

<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>

【问题讨论】:

    标签: java mule


    【解决方案1】:

    我在一个月前创建了一个 JIRA 来请求这样的功能:http://www.mulesoft.org/jira/browse/MULE-6877

    现在,您可以使用一个技巧:a Quartz inbound endpoint with an event generator jobrepeatCount = 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>
    

    【讨论】:

    • 不错的答案!谢谢。如果我创建一个石英入站端点,我是否还需要指定一个出站端点?
    • 不,您不需要,您的流程中的单个石英入站端点可以做到这一点。
    • 由于我使用的是 v3.2.1,因此 DefaultMuleMessage() 构造函数没有 FlowConstruct 选项。另外,我认为石英解决方案更清洁,因为我可以将石英:入站端点放入我想要自动运行的流程中。不过,我不熟悉通过石英进行流动。有这方面的例子吗?
    • 好的,看看那里的例子mulesoft.org/documentation/display/current/…
    • 非常有帮助的大卫。谢谢。我用我正在运行的石英示例更新了上面的问题。它在启动时成功触发,虽然它运行了两次而不是一次。
    【解决方案2】:

    另一种选择是使用执行此操作的自定义代理:
    http://www.mulesoft.org/documentation/display/current/Mule+Agents

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2020-07-05
      • 1970-01-01
      相关资源
      最近更新 更多