在集群环境中使用Quartz with Mule

时间:2015-06-06 04:25:45

标签: mule activemq

我有一个场景,我试图从Yelp API读取数据,并希望在一定的时间间隔后将其放入ActiveMQ队列,所以我使用的是石英调度程序。我的石英调度程序每隔10分钟运行一次将数据推送到队列, 一切都很好,直到这里,

现在我希望这可以在集群环境中工作,我将部署2个实例并监听相同的Yelp端点,现在发生的事情是,我的2个实例的石英调度程序正在同一个实例上执行并且它们提取相同的信息来自Yelp,导致相同的消息在ActiveMQ队列中登陆,即DUPLICATES,(我想将集群环境用于高可用性目的,即如果任何节点失败,其他节点可以接管。)

在Mule中是否有任何配置可以将一个节点作为主节点提升,另一个节点可以作为故障转移节点。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

这将由cron表达式0/10 * * * * ?(每10秒)触发一个运行相同应用程序并连接到同一数据库(在本例中为MySQL)的节点之一。 Quartz设置有点乱。您需要配置数据库等,但我让您学习Quartz文档。您应该查看版本1.8.x而不是2.x。

它几乎是Mule EE中群集端点的预算替代方案。当您不想集群EE节点或需要运行CE节点时,它非常有用。

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:quartz="http://www.mulesoft.org/schema/mule/quartz" xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.6.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/quartz http://www.mulesoft.org/schema/mule/quartz/current/mule-quartz.xsd">

    <quartz:connector name="quartzConnector" validateConnections="true" doc:name="Quartz">
        <quartz:factory-property key="org.quartz.scheduler.instanceName" value="QuartzScheduler" />
        <quartz:factory-property key="org.quartz.scheduler.instanceId" value="AUTO" />
        <quartz:factory-property key="org.quartz.jobStore.isClustered" value="true" />
        <quartz:factory-property key="org.quartz.scheduler.jobFactory.class" value="org.quartz.simpl.SimpleJobFactory" />
        <quartz:factory-property key="org.quartz.threadPool.class" value="org.quartz.simpl.SimpleThreadPool" />
        <quartz:factory-property key="org.quartz.threadPool.threadCount" value="3" />
        <quartz:factory-property key="org.quartz.scheduler.rmi.proxy" value="false" />
        <quartz:factory-property key="org.quartz.scheduler.rmi.export" value="false" />

        <quartz:factory-property key="org.quartz.jobStore.class" value="org.quartz.impl.jdbcjobstore.JobStoreTX" />
        <quartz:factory-property key="org.quartz.jobStore.driverDelegateClass" value="org.quartz.impl.jdbcjobstore.StdJDBCDelegate" />
        <quartz:factory-property key="org.quartz.jobStore.dataSource" value="quartzDataSource" />
        <quartz:factory-property key="org.quartz.jobStore.tablePrefix" value="QRTZ_" />

        <quartz:factory-property key="org.quartz.dataSource.quartzDataSource.driver"  value="com.mysql.jdbc.Driver" />

        <quartz:factory-property key="org.quartz.dataSource.quartzDataSource.URL" value="jdbc:mysql://localhost:3306/qrtz" />
        <quartz:factory-property key="org.quartz.dataSource.quartzDataSource.user" value="root" />
        <quartz:factory-property key="org.quartz.dataSource.quartzDataSource.password"  value="" />
        <quartz:factory-property key="org.quartz.dataSource.quartzDataSource.maxConnections"  value="8" /> 

    </quartz:connector>

    <flow name="cFlow1">
        <quartz:inbound-endpoint jobName="job1" cronExpression="0/10 * * * * ?" repeatInterval="0" connector-ref="quartzConnector" responseTimeout="10000" doc:name="Quartz">
            <quartz:event-generator-job>
                <quartz:payload>Job Trigger</quartz:payload>
            </quartz:event-generator-job>
        </quartz:inbound-endpoint>
        <logger level="INFO" message="Got message" doc:name="Logger"/>
    </flow>        
</mule>

答案 1 :(得分:-1)

我们使用3.5.2-Enterprise版本,但不确定社区版本是否有限制。你能尝试以下方式,看看是否有效:

<!-- Quart Connector with one thread to ensure that we don't have duplicate processing at any point of time -->
<quartz:connector name="QuartzConnector" validateConnections="true">
    <receiver-threading-profile maxThreadsActive="1" />
</quartz:connector> 

然后,无论您计划触发此操作,请在流程中引用此内容。

<flow name="test">
    <quartz:inbound-endpoint jobName="myQuartzJob" cronExpression="${my.job.cron.expression}" repeatInterval="${my.job.repeat.interval}" responseTimeout="${my.job.response.timeout}" connector-ref="QuartzConnector">
        <quartz:event-generator-job>
            <quartz:payload>blah</quartz:payload>
        </quartz:event-generator-job>
    </quartz:inbound-endpoint>
</flow>    

希望有效。