我们的组件有多个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?
2条答案
按热度按时间evrscar21#
Camel现在有一些内置的集群功能-请参见here。
在您的特定情况下,您可以对在启动quartz调度程序时处于主导地位的路由进行建模,从而防止其他节点启动。
设置它非常简单,您所需要的只是根据master组件语法为singleton端点添加前缀:主控形状:命名空间:委托Uri
这将导致以下结果:
tgabmvqs2#
Quartz需要一个JDBC作业存储,以防在一个集群中运行多个服务器。同样,为每个服务器分配一个唯一的示例ID也很重要。完整的示例请参见https://medium.com/javarevisited/spring-boot-using-quartz-in-mode-cluster-e1d71e4af4b9,包括docker-compose文件。
以下是要使用的最重要的设置: