为什么停止MuleSoft流导致Quartz'重复间隔'停止工作?

时间:2015-12-22 19:19:30

标签: mule mule-studio mule-component

我们有一个由Quartz连接器触发的MuleSoft应用程序。

此外,在应用程序中还有一个以FTP入站端点开头的流程,该端口为FTP服务器上的文件进行ping操作。检测到文件时,会读取它们。一切都很好。

我们需要停止FTP入站端点,以便它不会整天ping。因此,我们希望关闭(即停止)包含FTP传输连接器的流程。

问题?在测试期间,我们的石英作业设置为每隔几分钟运行一次。如果我们使用FTP阅读器停止流程,则Quartz重复间隔有效。每一点点应用程序开始。完美......有点。

但是......当我们按照我们想要的方式通过Java组件以编程方式停止流程时,那么Quartz重复间隔永远不会重复。它在启动时运行一次,然后在此之后永远停留。

当某个应用程序的某个组件上的Flow停止时,是否有内部会对Quartz时序控件造成污染?

这是使用Quartz作业的Flow。我们想要停止的流程在Main内部。

<flow name="offline-pricing-flow" doc:name="offline-pricing-flow"> 
    <quartz:inbound-endpoint jobName="OLP" repeatInterval="300000" responseTimeout="10000" doc:name="Quartz" cronExpression="0 0/5 * 1/1 * ? *"> 
        <quartz:event-generator-job></quartz:event-generator-job>  
    </quartz:inbound-endpoint>  
    <flow-ref name="init-flow" doc:name="Init"></flow-ref>  
    <flow-ref name="main-flow" doc:name="Main" doc:description="Main processing."></flow-ref>  
</flow>

以下是我们停止流程的代码:

FlowConstruct flow = context.getRegistry().lookupFlowConstruct("file-service-flow");

if (flow != null && flow.getMuleContext().isStarted()) {
    try {

        flow.getMuleContext().stop();

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

在应用程序的早期,我们尝试在组件中以这种方式启动它:

@Override
public Object onCall(MuleEventContext eventContext) throws Exception {

    FlowConstruct flow = eventContext.getMuleContext().getRegistry().lookupFlowConstruct("file-service-flow");

    if (flow != null && flow.getMuleContext().isStopped()) {
        try {

            flow.getMuleContext().start();

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

    return eventContext.getMessage().getPayload();
}

1 个答案:

答案 0 :(得分:0)

我的错误是我自己的。

上面我描述了这个动作,并问为什么我的Quartz作业停止了,但发生的事情是我实际上是在停止MuleContext - 而不是流本身。这是我不正确的尝试。

$table->integer('follower_id')->unsigned();
$table->integer('followee_id')->unsigned();
$table->foreign('follower_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('followee_id')->references('id')->on('users')->onDelete('cascade');

我现在可以看到我是如何猜测的。

这是正确的方法。我终于找到了一个例子,我可以看到我的注册表查找错误。

我需要将查找转换为AbstractFlowConstruct而不是FlowConstruct。之后它完美地运作了。我现在更聪明了。

FlowConstruct flow = context.getRegistry().lookupFlowConstruct("file-service-flow");

if (flow != null && flow.getMuleContext().isStarted()) {
    try {

        flow.getMuleContext().stop();

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