Solon2 开发之IoC,六、提取 Bean 的函数进行定制开发

为什么需要提取Bean的函数?绝不是闲得淡疼。比如:控制器的@Mapping;再比如:Xxl-Job的@XxlJob。这些都是要提取Bean的函数并定制加工的。

1、比如提取 @XxlJob 注解的函数,并注册到执行器

对Xxl-Job框架来说@XxlJob注解是已经存在的。适配,只需要注册一个Bean提取器即可:

注解类:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface XxlJob {
    String value();
    String init() default "";
    String destroy() default "";
}

注解类对应的能力注册:

 Solon.context().beanExtractorAdd(XxlJob.class, (bw, method, anno)->{
    //简单写下,以示意这个特性...
    //
    String name = anno.value();
    IJobHandler handler = new MethodJobHandler(bw.raw(), method, null, null);
    
    XxlJobExecutor.registJobHandler(name, handler);
 });

一顿简单操作,Bean里的函数已经变成Xxx-Job里job了。

2、应用

@Component
public class SampleXxlJob {
    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello World.");

        for (int i = 0; i < 5; i++) {
            XxlJobHelper.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        // default success
    }


    /**
     * 2、分片广播任务
     */
    @XxlJob("shardingJobHandler")
    public void shardingJobHandler() throws Exception {

        // 分片参数
        int shardIndex = XxlJobHelper.getShardIndex();
        int shardTotal = XxlJobHelper.getShardTotal();

        XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);

        // 业务逻辑
        for (int i = 0; i < shardTotal; i++) {
            if (i == shardIndex) {
                XxlJobHelper.log("第 {} 片, 命中分片开始处理", i);
            } else {
                XxlJobHelper.log("第 {} 片, 忽略", i);
            }
        }

    }
}

如果你不喜欢这个注解,也可以很快换成像:@CloudJob。通过提取器,将Method注册到它的执行器里就OK。

posted @ 2023-02-12 22:03  带刺的坐椅  阅读(20)  评论(0编辑  收藏  举报