Кто-нибудь имеет опыт или знает, как использовать SimpleScheduledRoutePolicy для управления планировщиком во время выполнения? Чтобы изменить время планировщика, приостановите или возобновите. Я пытался использовать это в проекте весенней загрузки, но он не работает так, как задокументировано. Ниже приведена моя конфигурация маршрута и тестовый класс, который я использовал для проверки.

@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>
0
Retheesh 17 Апр 2020 в 16:32

1 ответ

SimpleScheduledRoutePolicy работает должным образом — он запускает ваш Camel Route и вот для чего он нужен: запуск и остановка маршрутов.

Из-за вашего теста я предполагаю, что вы хотите иметь конечную точку планировщика, которая запускает сообщения в настроенный интервал. Для этого вы должны использовать Camel Timer, Camel Scheduler или Верблюжий кварц.

Поскольку ваш маршрут не содержит ни одного из них, планировщик просто не может быть запущен.

Чтобы создать планировщик, который (после первоначального ожидания 5 секунд) срабатывает каждые 3 секунды, вы можете использовать, например, это:

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

Изменить во время выполнения (добавлено из-за комментария)

Компонент Camel Quartz, очевидно, использует планировщик Quartz, а Quartz предоставляет JMX. доступ. Так что, если вы хотите изменить планировщик, это, вероятно, ваш лучший вариант.

Чтобы запускать и останавливать маршруты во время выполнения, вам следует взглянуть на Camel Controlbus.

1
burki 24 Апр 2020 в 08:37
Мое требование — планировщик, но я хотел контролировать его во время выполнения, изменяя частоту, приостанавливая, возобновляя и т. д. Я думал, что смогу сделать это с помощью SimpleScheduledRoutePolicy. Примеры на сайте верблюда (camel.apache.org/manual/latest/simplescheduledroutepolicy.html< /a>) имеют маршрут, начинающийся с прямого компонента, и назначается политика, как в моем примере. Но таким образом мой планировщик даже не запускается. Так что я не мог понять
 – 
Retheesh
23 Апр 2020 в 20:55
Эти примеры, которые вы упомянули, не содержат никакого планировщика, и то же самое относится к вашему маршруту. Итак, что бы вы ни делали с этими маршрутами, запуск планировщика невозможен, потому что он не существует. Вы получаете планировщик только в том случае, если используете один из трех компонентов, которые я упоминаю. См. мой расширенный ответ об изменениях во время выполнения.
 – 
burki
24 Апр 2020 в 08:40
Примеры, приведенные на сайте верблюда, также не используют планировщик, но политика применяется к прямому компоненту, так как мне интерпретировать эти примеры.
 – 
Retheesh
28 Апр 2020 в 14:08
Примеры на этой странице Camel просто запускают прямой маршрут Camel. Сам маршрут вообще ничего не делает, кроме маршрутизации входящего сообщения на фиктивную конечную точку. Настройки RepeatCount и RepeatInterval предназначены для начала маршрута через заданный интервал.
 – 
burki
29 Апр 2020 в 09:16
Маршрут ничего не делает, но он должен вызываться в соответствии с количеством повторов и правильным интервалом повторения. Этого не происходит. Я заметил, что он вызывается только один раз, когда вы запускаете приложение или вызываете маршрут с другого маршрута. Запускается ли маршрут автоматически столько раз в соответствии с политикой в ​​вашем случае?
 – 
Retheesh
29 Апр 2020 в 20:19