繁体   English   中英

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

[英]How to run clustered camel-quartz schedulers in spring-boot

我们的组件有多个骆驼石英调度器。 当我们在不同的服务器上部署应用程序的多个实例时,这些调度程序会在所有实例中运行并执行逻辑。 我们希望这些实例中只有一个应该运行调度程序。

为此,我们想到了使用 Quartz 的集群调度模式。 为此,我读到我们需要将相关属性放在quartz.properties 文件中,isClustered=true。 这里要注意的是,我们使用 Apache Ignite 作为我们的持久存储。 所以我也把 ignite jdbc thin driver 作为我们的数据源。 属性文件放在 src/main/resources 文件夹中,我们的骆驼 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 应该是默认设置,但是当我们在两个不同的实例中运行我们的应用程序时,调度程序仍然在两个实例中运行。

在调试模式下运行此应用程序后,我也看不到 Camel 能够读取此属性文件。 当我在我的机器上运行多个调度程序时,它们都会执行。 所以无论如何都不会发生集群。

请帮助我们如何将quartz.properties文件设置为camel-quartz组件配置的propertiesFile?

Camel 现在有一些内置的集群功能 - 见这里

在您的特定情况下,您可以建模一条在启动石英调度程序时占据领导地位的路线,从而防止其他节点触发。

设置它非常简单,您只需根据主组件语法为单例端点添加前缀: master:namespace:delegateUri

这将导致这样的事情:

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

Quartz 需要一个 JDBC 作业存储,以防您在集群中运行多个服务器。 此外,为每个服务器分配一个唯一的实例 ID 也很重要。 有关完整示例,包括 docker-compose 文件,请参阅https://medium.com/javarevisited/spring-boot-using-quartz-in-mode-cluster-e1d71e4af4b9

以下是要使用的最重要的设置:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM