如何在spring-boot中运行集群camel-quartz调度程序

ego6inou  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(288)

我们的组件有多个camel-quartz调度程序。当我们在不同的服务器上部署应用程序的多个示例时,这些调度程序在所有示例中运行并执行逻辑。我们希望这些示例中只有一个运行调度程序。
为了实现这一点,我们考虑使用Quartz的集群调度模式。为此,我了解到我们需要将相关属性放在quartz.properties文件中,isClustered=true。这里需要注意的一点是,我们使用Apache Ignite作为我们的持久存储。因此,我还将ignite jdbc thin驱动程序作为我们的数据源。属性文件放在src/main/resources文件夹中,我们的camel routeBuilder如下:

public void configure() throws Exception
    {
        AbstractApplicationConfiguration.RouteConfig routeConfig = appConfig.getCamel().fetchRoute(ROUTE_ID);
        from(routeConfig.getInputEndpoints()[0])
            .to(appConfig.getCamel().getMetricEndpoints().getTimerEndpoint() + "&" + CAMEL_MICROMETER_ACTION_START + "&" + CAMEL_MICROMETER_TAG_ROUTE + ROUTE_ID)
            .to(appConfig.getCamel().getMetricEndpoints().getCounterEndpoint() + "&" + CAMEL_MICROMETER_ACTION_START + "&" + CAMEL_MICROMETER_TAG_ROUTE + ROUTE_ID)
    }

根据资源使用情况作参考来实现这一点:https://developers.redhat.com/blog/2017/08/10/using-clustered-camel-quartz-jobs-on-jboss-eapquartz.properties默认情况下应设置www.example.com,但当我们在两个不同的示例中运行应用程序时,调度程序仍在这两个示例中运行。
在调试模式下运行此应用程序后,我也无法看到Camel能够读取此属性文件。当我在计算机上运行多个调度程序时,所有调度程序都会执行。因此,无论如何,群集不会发生。
请帮助我们如何将quartz.properties文件设置为camel-quartz组件配置的propertiesFile?

evrscar2

evrscar21#

Camel现在有一些内置的集群功能-请参见here
在您的特定情况下,您可以对在启动quartz调度程序时处于主导地位的路由进行建模,从而防止其他节点启动。
设置它非常简单,您所需要的只是根据master组件语法为singleton端点添加前缀:主控形状:命名空间:委托Uri
这将导致以下结果:

from("master:my-cluster:quartz://myGroup/myTimerName?cron=0+0/5+12-18+?+*+MON-FRI")
        .routeId("clustered")
        .log("Clustered quartz scheduler !");
tgabmvqs

tgabmvqs2#

Quartz需要一个JDBC作业存储,以防在一个集群中运行多个服务器。同样,为每个服务器分配一个唯一的示例ID也很重要。完整的示例请参见https://medium.com/javarevisited/spring-boot-using-quartz-in-mode-cluster-e1d71e4af4b9,包括docker-compose文件。
以下是要使用的最重要的设置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/myapp
    username: xxx
    password: xxx
  quartz:
    job-store-type: jdbc
    jdbc:
      initialize-schema: never
    properties:
      org:
        quartz:
          scheduler:
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            isClustered: true

相关问题