Solon v2.7.5

六、提取 Bean 的函数进行定制开发

</> markdown

为什么需要提取Bean的函数?绝不是闲得淡疼。比如:定时任务的 "@Scheduled"、"@CloudJob"。这些都是要提取 Bean 的函数并定制加工的。

提醒:Bean 的函数提取,只对使用 @Component 注解的类有效。

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

定义注解类:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Scheduled {
    String name() default "";
    String cron() default "";
    ...
}

注册 "@Scheduled" 对应的处理能力:

public class XPluginImp implements Plugin {
    @Override
    public void start(AppContext context) {
        //注册提取器
        context.beanExtractorAdd(Scheduled.class, (bw,method,anno)->{
            if (method.getParameterCount() > 0) {
                throw new IllegalStateException("Scheduling local job not supports parameter!");
            }

            MethodRunnable job = new MethodRunnable(bw.raw(), method);
            String jobId = bw.clz().getName() + "::" + method.getName();
            String name = Utils.annoAlias(anno.name(), jobId);

            JobManager.add(name, anno, job);
        });
    }
}

一顿简单操作后,Bean里的函数已经变成 “@Scheduled” 定时任务了。

2、应用

@Component
public class DemoJobBean {
    /**
     * 1、简单任务示例(Bean模式)
     */
    @Scheduled(name="job1", cron="1/2 * * * * * ?")
    public void job1() throws Exception {
        //...
    }
}

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