首页 > 解决方案 > SimpleScheduledRoutePolicy 在特定时间不起作用

问题描述

我正在开发一个 Web 应用程序,用户在其中添加问题,指定他/她应该收到通知邮件的日期和时间。我是 apache 骆驼和石英调度程序的新手。

我编写了如下示例代码。IssueDTO 只不过是一个 POJO。如果问题是重复的,我已经配置了一个正常工作的 cron 调度程序,即如果我将频率指定为 5,我会得到预期的输出,即控制台的 println 语句。但是,如果问题不是重复的,我使用了 SimpleScheduledRoutePolicy 并硬编码了处理器的 process() 方法应该运行的日期和时间。我只是将日期时间更改为当前系统时间的 2 分钟后,以检查代码是否正常工作。但它永远不会进入 process 方法并打印此语句 => System.out.println("*******************" + issueDTO.getIssueId() + " running at " + gc.getTime().toString());

 @Override
    public void configure() throws Exception
    {
        System.out.println("in ReminderRouteBuilder configure()");
        System.out.println("Issue ID : " + issueDTO.getIssueId());
        System.out.println("Issue Frequency : " + issueDTO.getFrequency());
        System.out.println("Is Repetative : " + issueDTO.getIsRepetitive());

        // if Repetitive
        if (StringUtil.getBoolean(issueDTO.getIsRepetitive()))
        {
            String fromString = "quartz2://" + issueDTO.getIssueId() + "?cron=0/" + issueDTO.getFrequency() + "+*+*+*+*+?";
            from(fromString).process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception
                {
                    System.out.println(issueDTO.getIssueId() + " running every " + issueDTO.getFrequency() + " sec...");
                }
            });
        }
        // if not Repetitive
        else
        {
            SimpleScheduledRoutePolicy policy = new SimpleScheduledRoutePolicy();
            GregorianCalendar gc = new GregorianCalendar(2019, Calendar.AUGUST, 31, 13, 45);
            policy.setRouteStartDate(gc.getTime());

            from("direct:start").routeId(issueDTO.getIssueId()).routePolicy(policy).process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception
                {
                    System.out.println("*****************" + issueDTO.getIssueId() + " running at " + gc.getTime().toString());
                }
            });
        }
    }

我错过了什么吗?

标签: apache-camelquartz-scheduler

解决方案


直接端点需要通过某些事件手动触发。如果您需要某些东西,在路由开始后自动触发什么,您可以使用Timer端点repeatCount=1Quartz 端点fireNow=true

例如,这Exchange只会在路由启动后触发一次:

from("timer:start?repeatCount=1").routeId(issueDTO.getIssueId()).routePolicy(policy)

推荐阅读