【发布时间】:2020-03-25 15:51:30
【问题描述】:
我有一个自定义的 Apache Camel 组件,它由一个从 DefaultConsumer 扩展而来的消费者组成,没有生产者。
我有一个 Spring Boot 应用程序,其中包含其他几条 Camel 路线,它们都可以正常工作。
我想修改现有路由,使其每 X 分钟调用一次自定义组件。该路线运行一次时运行良好。它看起来像这样:
JacksonDataFormat enrichedAuditLogEntryFormat = new JacksonDataFormat(EnrichedAuditLogEntry.class);
from("alfaudit://http://acs.local:8080?username=" + user + "&password=" + password)
.routeId("alfrescoAuditLogToElastic")
.bean("alfAuditLogEntryEnricher")
.marshal(enrichedAuditLogEntryFormat)
.setHeader("indexId", header(AlfAuditConsumer.AUDIT_LOG_ENTRY_ID))
.to("elasticsearch-rest://elasticsearch?operation=Index&indexName=" + AUDIT_LOG_INDEX + "&indexType=" + AUDIT_LOG_TYPE);
我正在为如何实施计划而苦苦挣扎。我尝试定义一个 SimpleScheduledRoutePolicy,然后在路由上使用 setPolicy() 。我也用 setPolicy() 尝试过 CronScheduledRoutePolicy。如果您需要按计划开始或停止路线,这些似乎很有用。他们跑我的路线一次,但不要重复。只要应用程序正在运行,我就需要它每 X 分钟运行一次路线。
接下来,我尝试添加一个调用现有路由的石英路由,如下所示:
from("quartz2://fetchaudit?cron=0+0/5+*+*+*+?")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
CamelContext context = exchange.getContext();
context.startRoute("alfrescoAuditLogToElastic");
}
});
第一次工作,但是当下次触发作业时,它会尝试启动已经运行的路由。
我希望避免修改我的自定义组件以从 DefaultScheduledPollConsumer 扩展,因为它不会总是按计划使用。但是,如果这是解决这个问题的最佳方式,我愿意接受。
【问题讨论】:
标签: java apache-camel quartz-scheduler alfresco