TriggerBuilder详解

TriggerBuilder是⽤来创建触发器Trigger的。它与JobBuilder在整体结构或者说设计风格上可以说是⼀模⼀样的,同样采⽤Builder模式。

以下为TriggerBuilder类中的api说明:

1、TriggerBuilder.newTrigger()

调用自己的无参构造方法,创建⼀个新的TriggerBuilder,⽤它来定义触发器的规范。

源码:

/**
     * Create a new TriggerBuilder with which to define a 
     * specification(规范) for a Trigger.
     * 
     * @return the new TriggerBuilder
     */
    public static TriggerBuilder<Trigger> newTrigger() {
        return new TriggerBuilder<Trigger>();
    }
    

2、TriggerBuilder.withIdentity()

        TriggerBuilder和JobBuilder的withIdentity()⽅法⾮常⾮常的相似,甚⾄这两篇⽂章也⾮常相似。它们区别是:

        TriggerBuilder⽣成Trigger的唯⼀标识TriggerKey,暂时保存在TriggerBuilder中;

        JobBuilder是⽣成JobDetail的唯⼀标识JobKey,暂时保存在JobBuilder中。

     /**

       使用给定的名称和默认组创建唯一的TriggerKey,标识该Trigger。
     * Use a <code>TriggerKey</code> with the given name and default group to
     * identify the Trigger.
     * 
     * <p>If none of the 'withIdentity' methods are set on the TriggerBuilder,
     * then a random, unique TriggerKey will be generated.</p>
     * 
     * @param name the name element for the Trigger's TriggerKey
     * @return the updated TriggerBuilder
     * @see TriggerKey
     * @see Trigger#getKey()
     */
    public TriggerBuilder<T> withIdentity(String name) {
        key = new TriggerKey(name, null);
        return this;
    }  
    
    /**
        使用给定的名称和组 创建唯一的TriggerKey,标识该Trigger。
     * Use a TriggerKey with the given name and group to
     * identify the Trigger.
     * 
     * <p>If none of the 'withIdentity' methods are set on the TriggerBuilder,
     * then a random, unique TriggerKey will be generated.</p>
     * 
     * @param name the name element for the Trigger's TriggerKey
     * @param group the group element for the Trigger's TriggerKey
     * @return the updated TriggerBuilder
     * @see TriggerKey
     * @see Trigger#getKey()
     */
    public TriggerBuilder<T> withIdentity(String name, String group) {
        key = new TriggerKey(name, group);
        return this;
    }
    
    /**
       使用给定的TriggerKey 标识该Trigger
     * Use the given TriggerKey to identify the Trigger.  
     * 
     * <p>If none of the 'withIdentity' methods are set on the TriggerBuilder,
     * then a random, unique TriggerKey will be generated.</p>
     * 
     * @param triggerKey the TriggerKey for the Trigger to be built
     * @return the updated TriggerBuilder
     * @see TriggerKey
     * @see Trigger#getKey()
     */
    public TriggerBuilder<T> withIdentity(TriggerKey triggerKey) {
        this.key = triggerKey;
        return this;
    }

3、TriggerKey

        JobKey和TriggerKey真的可以说是⼀模⼀样,它们都Key的⼦类。除了参数名其他都⼀模⼀样,只不过⼀个⽤来标识JobDetail,⼀个⽤来标识Trigger。

public final class TriggerKey extends Key<TriggerKey> {
  
    private static final long serialVersionUID = 8070357886703449660L;

    public TriggerKey(String name) {
        super(name, null);
    }

    public TriggerKey(String name, String group) {
        super(name, group);
    }

    public static TriggerKey triggerKey(String name) {
        return new TriggerKey(name, null);
    }
    
    public static TriggerKey triggerKey(String name, String group) {
        return new TriggerKey(name, group);
    }
    
}

4、TriggerBuilder.startNow()

        Trigger从当前时刻开始执⾏。与startNow相似功能的⽅法还有startAt()endAt()。

 唯⼀需要注意的是:

        当调⽤startAt()⽅法时传⼊的时间早于cron表达式设置的时间,则将会触发⼀次,但不管cron表达式是否会多次执⾏,都只会触发⼀次。

        例如,cron表达式为:0 0 12 * * ?,即每天12点执⾏⼀次,⽽startAt设置的时间是三天前,那么创建定时任务后只会触发⼀次,⽽不是三次。

    /**
     * Set the time the Trigger should start at to the current moment - 
     * the trigger may or may not fire at this time - depending upon the 
     * schedule configured for the Trigger.  
     * 
     * @return the updated TriggerBuilder
     * @see Trigger#getStartTime()
     */
    public TriggerBuilder<T> startNow() {
        this.startTime = new Date();
        return this;
    }

    /**
        设置触发器从入参的triggerStartTime时间开始执行。

     * Set the time the Trigger should start at - the trigger may or may
     * not fire at this time - depending upon the schedule configured for
     * the Trigger.  However the Trigger will NOT fire before this time,
     * regardless of the Trigger's schedule.
     *  
     * @param triggerStartTime the start time for the Trigger.
     * @return the updated TriggerBuilder
     * @see Trigger#getStartTime()
     * @see DateBuilder
     */
    public TriggerBuilder<T> startAt(Date triggerStartTime) {
        this.startTime = triggerStartTime;
        return this;
    }

     /**
        设置触发器从入参的triggerEndTime时间结束执行。

     * Set the time at which the Trigger will no longer fire - even if it's
     * schedule has remaining repeats.    
     *  
     * @param triggerEndTime the end time for the Trigger.  If null, the end time is indefinite.
     * @return the updated TriggerBuilder
     * @see Trigger#getEndTime()
     * @see DateBuilder
     */
    public TriggerBuilder<T> endAt(Date triggerEndTime) {
        this.endTime = triggerEndTime;
        return this;
    }

代码示例:

// Trigger立即触发
TriggerBuilder.newTrigger().startNow().build();

// Trigger指定时间触发
TriggerBuilder.newTrigger().startAt(time).build();

// Trigger指定周期时间触发,即corn方式
TriggerBuilder.newTrigger().startNow().endAt(endTime)
                        .withSchedule(dailyAtHourAndMinute(start.getHours(), start.getMinutes()))
                        .build();

 

5、TriggerBuilder.withSchedule()

        这个⽅法⽤于设置ScheduleBuilder,⽽ScheduleBuilder在负责真正实例化出⼀个Trigger。之所以这么做是因为ScheduleBuilder接⼝有四个实现类(如下图),我们需要哪种Trigger,那么withSchedule中就传⼊哪种Trigger对应的ScheduleBuilder。


CronScheduleBuilder可以创建⼀个基于Cron表达式的Trigger,这也是使⽤最多、功能最强⼤的Trigger。 如:CronScheduleBuilder.cronSchedule(cron)

CronScheduleBuilder类之cronSchedule:

/**
     * Create a CronScheduleBuilder with the given cron-expression string -
     * which is presumed to be a valid cron expression (and hence only a
     * RuntimeException will be thrown if it is not).
     * 
     * @param cronExpression
     *            the cron expression string to base the schedule on.
     * @return the new CronScheduleBuilder
     * @throws RuntimeException
     *             wrapping a ParseException if the expression is invalid
     * @see CronExpression
     */
    public static CronScheduleBuilder cronSchedule(String cronExpression) {
        try {
            return cronSchedule(new CronExpression(cronExpression));
        } catch (ParseException e) {
            // all methods of construction ensure the expression is valid by
            // this point...
            throw new RuntimeException("CronExpression '" + cronExpression
                    + "' is invalid.", e);
        }
    }

 TriggerBuilder类之withSchedule:

 /**
     * Set the {@link ScheduleBuilder} that will be used to define the 
     * Trigger's schedule.
     * 
     * <p>The particular <code>SchedulerBuilder</code> used will dictate
     * the concrete type of Trigger that is produced by the TriggerBuilder.</p>
     * 
     * @param schedBuilder the SchedulerBuilder to use.
     * @return the updated TriggerBuilder
     * @see ScheduleBuilder
     * @see SimpleScheduleBuilder
     * @see CronScheduleBuilder
     * @see CalendarIntervalScheduleBuilder
     */
    @SuppressWarnings("unchecked")
    public <SBT extends T> TriggerBuilder<SBT> withSchedule(ScheduleBuilder<SBT> schedBuilder) {
        this.scheduleBuilder = schedBuilder;
        return (TriggerBuilder<SBT>) this;
    }

6、TriggerBuilder.build()

        build⽅法使⽤withSchedule()⽅法设置的ScheduleBuilder实例化⼀个MutableTrigger。上⾯我们说ScheduleBuilder有四个实现类,那⾃然会产⽣四种Trigger(如下图),⽽这四个Trigger都是MutableTrigger的⼦类。其实这⾥就是多态⽽已。⽗类的引⽤指向⼦类的⽰例。

 /**
     * Produce the <code>Trigger</code>.
     * 
     * @return a Trigger that meets the specifications of the builder.
     */
    @SuppressWarnings("unchecked")
    public T build() {

        if(scheduleBuilder == null)
            scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
        MutableTrigger trig = scheduleBuilder.build();
        
        trig.setCalendarName(calendarName);
        trig.setDescription(description);
        trig.setStartTime(startTime);
        trig.setEndTime(endTime);
        if(key == null)
            key = new TriggerKey(Key.createUniqueName(null), null);
        trig.setKey(key); 
        if(jobKey != null)
            trig.setJobKey(jobKey);
        trig.setPriority(priority);
        
        if(!jobDataMap.isEmpty())
            trig.setJobDataMap(jobDataMap);
        
        return (T) trig;
    }

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP)并提供可靠的消息传递机制。它可以用于构建分布式系统,处理大量的消息传递和异步通信。以下是关于RabbitMQ的一些详解: 1. 下载和安装:你可以从RabbitMQ官方网站下载RabbitMQ的安装包。你可以使用wget命令下载RabbitMQ的rpm包,例如:wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm。安装完成后,你可以双击安装包进行安装。安装完成后,你可以运行rabbitmq-plugins enable rabbitmq_management命令来安装RabbitMQ-Plugins插件。然后,你可以运行rabbitmq-server.bat来启动RabbitMQ服务。\[1\]\[2\] 2. 后台运行:如果你想在后台运行RabbitMQ,你可以使用rabbitmq-server -detached命令来启动RabbitMQ服务。如果你想停止RabbitMQ服务,你可以使用rabbitmqctl stop命令。\[3\] 总结起来,RabbitMQ是一个功能强大的消息代理软件,它可以用于构建分布式系统和处理大量的消息传递。你可以通过下载和安装RabbitMQ来开始使用它,并且可以选择在前台或后台运行RabbitMQ服务。 #### 引用[.reference_title] - *1* *2* [RabbitMQ详解,用心看完这一篇就够了【重点】](https://blog.csdn.net/weixin_42039228/article/details/123493937)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [RabbitMQ 详解](https://blog.csdn.net/m0_53067943/article/details/130578563)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值