【问题标题】:Apache Camel: Help in understanding usage of SimpleScheduledRoutePolicyApache Camel:帮助理解 SimpleScheduledRoutePolicy 的使用
【发布时间】:2020-04-17 13:32:31
【问题描述】:

任何人都有经验或知道如何使用 SimpleScheduledRoutePolicy 在运行时管理调度程序?要更改调度程序计时,请暂停或恢复。我尝试在 Spring Boot 项目中使用它,但它没有按记录工作。下面是我的 Route 配置和我用来测试它的 Test 类。

@Component
public class MyRouter extends RouteBuilder {

    private static final Logger logger = LoggerFactory.getLogger(MyRouter.class);


    @Override
    public void configure() throws Exception {
        SimpleScheduledRoutePolicy simpleScheduledRoutePolicy = new SimpleScheduledRoutePolicy();
        long startTime = System.currentTimeMillis() + 5000l;
        simpleScheduledRoutePolicy.setRouteStartDate(new Date(startTime));
        simpleScheduledRoutePolicy.setRouteStartRepeatInterval(3000l);
        simpleScheduledRoutePolicy.setRouteStartRepeatCount(3);

        from("direct:myroute")
                .routeId("myroute")
                .routePolicy(simpleScheduledRoutePolicy)
                .autoStartup(true)
                .log(LoggingLevel.INFO, logger, "myroute invoked")
                .to("mock:test");
    }
}

测试类代码

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
public class MyRouterTest {

    @Autowired
    private CamelContext camelContext;

    @EndpointInject("mock:test")
    MockEndpoint resultEndpoint;

    @SneakyThrows
    @Test
    public void myRouteIsScheduledSuccessfully() {
        resultEndpoint.expectedMessageCount(2);
        Thread.sleep(7000);
        resultEndpoint.assertIsSatisfied();
    }

}

但我只是在日志下方显示调度程序已启动,但它并未按照策略中的配置每 3 秒触发一次。 我试图从测试方法调用直接组件,仍然无法正常工作。不知道我哪里错了。

[INFO ] 2020-04-17 15:22:17.928 [main] MyRouterTest - Starting MyRouterTest on PPC11549 with PID 20892 (started by rmr in C:\Data\Telenet\Workspaces\atoms-event-engine)
[DEBUG] 2020-04-17 15:22:17.930 [main] MyRouterTest - Running with Spring Boot v2.2.6.RELEASE, Spring v5.2.5.RELEASE
[INFO ] 2020-04-17 15:22:17.932 [main] MyRouterTest - No active profile set, falling back to default profiles: default
[INFO ] 2020-04-17 15:22:19.634 [main] RepositoryConfigurationDelegate - Bootstrapping Spring Data JDBC repositories in DEFAULT mode.
[INFO ] 2020-04-17 15:22:19.679 [main] RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 36ms. Found 0 JDBC repository interfaces.
[INFO ] 2020-04-17 15:22:20.226 [main] PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.apache.camel.spring.boot.CamelAutoConfiguration' of type [org.apache.camel.spring.boot.CamelAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[INFO ] 2020-04-17 15:22:20.848 [main] HikariDataSource - HikariPool-1 - Starting...
[INFO ] 2020-04-17 15:22:21.437 [main] HikariDataSource - HikariPool-1 - Start completed.
[INFO ] 2020-04-17 15:22:22.602 [main] LRUCacheFactory - Detected and using LURCacheFactory: camel-caffeine-lrucache
[INFO ] 2020-04-17 15:22:24.082 [main] JobRepositoryFactoryBean - No database type set, using meta data indicating: H2
[INFO ] 2020-04-17 15:22:24.120 [main] SimpleJobLauncher - No TaskExecutor has been set, defaulting to synchronous executor.
[INFO ] 2020-04-17 15:22:24.485 [main] ThreadPoolTaskScheduler - Initializing ExecutorService 'taskScheduler'
[INFO ] 2020-04-17 15:22:24.695 [main] SpringBootRoutesCollector - Loading additional Camel XML routes from: classpath:camel/*.xml
[INFO ] 2020-04-17 15:22:24.698 [main] SpringBootRoutesCollector - Loading additional Camel XML rests from: classpath:camel-rest/*.xml
[INFO ] 2020-04-17 15:22:24.727 [main] MyRouterTest - Started MyRouterTest in 7.338 seconds (JVM running for 11.356)
[INFO ] 2020-04-17 15:22:24.729 [main] JobLauncherCommandLineRunner - Running default command line with: []
[INFO ] 2020-04-17 15:22:24.734 [main] CamelAnnotationsHandler - Setting shutdown timeout to [10 SECONDS] on CamelContext with name [camelContext].
[INFO ] 2020-04-17 15:22:24.815 [main] CamelSpringBootExecutionListener - @RunWith(CamelSpringBootRunner.class) before: class com.telenet.atoms.eventengine.camel.MyRouterTest.myRouteIsScheduledSuccessfully
[INFO ] 2020-04-17 15:22:24.817 [main] CamelSpringBootExecutionListener - Initialized CamelSpringBootRunner now ready to start CamelContext
[INFO ] 2020-04-17 15:22:24.818 [main] CamelAnnotationsHandler - Starting CamelContext with name [camelContext].
[INFO ] 2020-04-17 15:22:24.902 [main] DefaultManagementStrategy - JMX is enabled
[INFO ] 2020-04-17 15:22:25.308 [main] AbstractCamelContext - Apache Camel 3.2.0 (CamelContext: camel-1) is starting
[INFO ] 2020-04-17 15:22:25.438 [main] QuartzComponent - Create and initializing scheduler.
[INFO ] 2020-04-17 15:22:25.442 [main] QuartzComponent - Setting org.quartz.scheduler.jmx.export=true to ensure QuartzScheduler(s) will be enlisted in JMX.
[INFO ] 2020-04-17 15:22:25.483 [main] StdSchedulerFactory - Using default implementation for ThreadExecutor
[INFO ] 2020-04-17 15:22:25.487 [main] SimpleThreadPool - Job execution threads will use class loader of thread: main
[INFO ] 2020-04-17 15:22:25.511 [main] SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[INFO ] 2020-04-17 15:22:25.511 [main] QuartzScheduler - Quartz Scheduler v.2.3.2 created.
[INFO ] 2020-04-17 15:22:25.516 [main] RAMJobStore - RAMJobStore initialized.
[INFO ] 2020-04-17 15:22:25.528 [main] QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.2) 'DefaultQuartzScheduler-camel-1' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

[INFO ] 2020-04-17 15:22:25.528 [main] StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler-camel-1' initialized from an externally provided properties instance.
[INFO ] 2020-04-17 15:22:25.528 [main] StdSchedulerFactory - Quartz scheduler version: 2.3.2
[INFO ] 2020-04-17 15:22:25.529 [main] AbstractCamelContext - StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
[INFO ] 2020-04-17 15:22:25.623 [main] AbstractCamelContext - Route: myroute started and consuming from: direct://myroute
[INFO ] 2020-04-17 15:22:25.625 [main] AbstractCamelContext - Route: orderfault started and consuming from: direct://orderfault
[INFO ] 2020-04-17 15:22:25.637 [main] AbstractCamelContext - Total 2 routes, of which 2 are started
[INFO ] 2020-04-17 15:22:25.638 [main] AbstractCamelContext - Apache Camel 3.2.0 (CamelContext: camel-1) started in 0.329 seconds
[INFO ] 2020-04-17 15:22:25.663 [main] ScheduledRoutePolicy - Scheduled trigger: triggerGroup-myroute.trigger-START-myroute for action: START on route myroute
[INFO ] 2020-04-17 15:22:25.663 [main] ScheduledRoutePolicy - Scheduled trigger: triggerGroup-orderfault.trigger-START-orderfault for action: START on route orderfault
[INFO ] 2020-04-17 15:22:25.664 [main] QuartzComponent - Starting scheduler.
[INFO ] 2020-04-17 15:22:25.665 [main] QuartzScheduler - Scheduler DefaultQuartzScheduler-camel-1_$_NON_CLUSTERED started.
[INFO ] 2020-04-17 15:22:33.101 [main] MockEndpoint - Asserting: mock://test is satisfied
[INFO ] 2020-04-17 15:22:43.134 [main] MyRouterTest - ********************************************************************************
[INFO ] 2020-04-17 15:22:43.135 [main] MyRouterTest - Testing done: myRouteIsScheduledSuccessfully(com.telenet.atoms.eventengine.camel.MyRouterTest)
[INFO ] 2020-04-17 15:22:43.136 [main] MyRouterTest - Took: 17.469 seconds (17469 millis)
[INFO ] 2020-04-17 15:22:43.136 [main] MyRouterTest - ********************************************************************************
[INFO ] 2020-04-17 15:22:43.137 [main] CamelSpringBootExecutionListener - @RunWith(CamelSpringBootRunner.class) after: class com.telenet.atoms.eventengine.camel.MyRouterTest.myRouteIsScheduledSuccessfully

java.lang.AssertionError: mock://test Received message count. Expected: <2> but was: <0>

【问题讨论】:

    标签: spring spring-boot apache-camel quartz-scheduler


    【解决方案1】:

    SimpleScheduledRoutePolicy 按预期工作 - 它启动您的骆驼路线,这就是它的用途:开始和停止路线。

    由于您的测试,我猜您希望有一个调度程序端点以配置的时间间隔触发消息。为此,您必须使用 Camel TimerCamel SchedulerCamel Quartz

    由于您的路线不包含任何这些,根本没有可以启动的调度程序。

    要创建一个调度程序(在最初等待 5 秒后)每 3 秒触发一次,您可以使用以下示例:

    from("scheduler://foo?initialDelay=5s&delay=3s")...
    

    运行时更改(因评论而添加)

    Camel Quartz 组件显然使用了 Quartz 调度程序,并且 Quartz 提供了 JMX 访问。因此,如果您想更改调度程序,这可能是您的最佳选择。

    要在运行时启动和停止路由,您应该查看Camel Controlbus

    【讨论】:

    • 我的需求是一个调度器,但我想在运行时通过改变频率、暂停、恢复等来控制它。我想我可以通过 SimpleScheduledRoutePolicy 来实现。骆驼站点 (camel.apache.org/manual/latest/simplescheduledroutepolicy.html) 中的示例具有从直接组件开始的路由并分配了策略,类似于我的示例。但是通过这种方式,我的调度程序甚至没有启动。所以我无法理解
    • 您提到的这些示例不包含任何调度程序,这同样适用于您的路线。因此,无论您对这些路由做什么,都不会启动调度程序,因为它不存在。如果您使用我提到的三个组件之一,您只会获得一个调度程序。有关运行时更改,请参阅我的扩展答案。
    • 骆驼站点中给出的示例也没有使用调度程序,但该策略应用于直接组件,那么我应该如何解释这些示例..
    • this Camel page 上的示例只是启动骆驼直达路线。除了将传入消息路由到 Mock 端点之外,路由本身什么都不做。 RepeatCountRepeatInterval 设置用于在给定的时间间隔内开始路线
    • 路由什么都不做,但应该根据重复计数和重复间隔正确调用。这没有发生。我注意到它仅在您启动应用程序或从另一条路由调用该路由时被调用一次。在您的案例中,路由是否会根据策略自动触发多次?
    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多