没有 JobStore 的 Mule 集群中的 Quartz 应用程序

Quartz application in Mule cluster without JobStore

我们目前有一个本地集群环境,其中有 2 个节点集群。我们正在使用 Mule 3.8.2 运行时。 我们知道 quartz 不是集群感知的,在 google 搜索之后,我们发现如果我们在集群中部署 quartz 它将同时从两个节点触发。因此,为此我们需要在 quartz

中配置 JDBC Job Store

为了测试它,我在没有任何作业存储的集群中部署了以下 Mule 流:

<quartz:connector name="QuartzConn" validateConnections="true" doc:name="Quartz">
    <receiver-threading-profile maxThreadsActive="1"/>
</quartz:connector> 
 
<flow name="TestFlow" processingStrategy="synchronous">
    <quartz:inbound-endpoint name="connectorname" jobName="testjob" repeatInterval="10000"
                responseTimeout="10000" doc:name="QuartzConn" connector-ref="QuartzConn">
        <quartz:event-generator-job>
            <quartz:payload>This is a test payload</quartz:payload>
        </quartz:event-generator-job>
    </quartz:inbound-endpoint>
    <logger message="Server Name:- #[server.ip+'\n'] This is a message #[function:now]" level="INFO" doc:name="Logger"/>
    <file:outbound-endpoint path="E:\test" outputPattern="#[server.dateTime.format('YYYY-MM-dd-hh-mm-ss.sss')].txt" responseTimeout="10000" doc:name="File"/>
</flow>

但令我惊讶的是,目前只有一个节点正在执行 quartz 并且文件已写入带有时间戳的目标文件夹中,而其他节点则在静静地等待,什么也不做!!!

节点 1 正在写入所有文件:

当Node2默默等待观察时:

(图片附后)

因此,为了进一步测试,我关闭了 Node1,我发现 Node2 开始选择任务并正在写入文件。

请注意这是一个简单的石英应用程序,没有配置任何 jdbc 作业存储。那么,我该如何解释这个动作呢?两个节点都配置了 mmc 并且性能良好。

如果有人能更详细地解释一下集群中的石英,那将会很有帮助。

谢谢

如果你只是想试试它的好,但使用 Mule 集群,你不需要添加 Quartz,而是使用 Poll scope。可能 Mule 集群的存在启用了没有 JDBC 作业存储的石英集群。但是,在 non-clustered Mule 设置中(我们有 2 个 non-clustered 节点),带有 JDBC 作业存储的 Quartz 集群是唯一的选择。

Mulesoft 玩得很聪明。他们添加了很好的轮询范围,但在具有至少 2 个节点的典型生产环境中,您只需要一个节点进行轮询。这只有在您购买 Mule 的称为高可用性的集群时才有可能,但它仅在白金订阅中可用(不是黄金)。因此,Mulesoft 间接地强迫客户购买或升级到白金订阅以从同一产品中获取更多收益。

"I don't want to use poll, as I need to know the reason of it's working"...那是你的选择,但是 Mule documentation 清楚地表明在集群环境中首选 Poll 范围。

而在 non-clustered 环境中,您可以将 Quartz 与 JDBC jobstore 一起使用来实现相同的功能,但有点复杂。解释 here and here