【前言】接前文「JFinal+Quartz动态任务调度控制台」,前面只完成了任务调度,本文使用JFinal+Hessian实现后台调用远程服务,服务端的Spring+Hessian不在本文重点讨论范围。
【正文】
逻辑:后台通过一个抽象类完成远程服务配置,具体的任务业务类继承该抽象类,调用抽象类中的远程服务对象及相应的方法。(本需求是应对单一接口,每个任务业务类调用该接口中的一个方法)
maven依赖直接从服务端的pom.xml里面找
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>
任务抽象借口
public abstract class AbstractJob implements Job {
public static final Logger LOG = Logger.getLogger(AbstractJob.class);
//这个变量存放远程服务地址,最好写到配置文件中,方便不同环境切换,此处简写方便理解
public static final String SERVICE_URL = "http://127.0.0.1:8080/jobService";
//这个接口是服务端api项目里的,所以pom.xml中要添加相应的api项目依赖
private static JobService jobService;
//单例模式
public static synchronized JobService getInstance() throws Exception{
if(jobService==null){
HessianProxyFactory factory = new HessianProxyFactory();
factory.setOverloadEnabled(true);
jobService = (JobService) factory.create(JobService.class, SERVICE_URL);
return jobService;
}
return jobService;
}
}
注:上述代码中的SERVICE_URL具体内容按照服务端访问路径和服务接口的Hessian配置来决定。
任务业务类
public class DynamicJob extends AbstractJob{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
LOG.info("DynamicJob_START");
//getInstance()获取远程服务对象
//test()方法为目标服务,需要在服务端中实现。
getInstance().test1();
LOG.info("DynamicJob_SUCCESS");
} catch (Exception e) {
LOG.error("DynamicJob_FAIL_e=="+e);
}
}
}
不同的任务调用远程服务接口中不同的方法即可
public class DynamicJob2 extends AbstractJob{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
LOG.info("DynamicJob2_START");
//getInstance()获取远程服务对象
//test2()方法为目标服务,需要在服务端中实现。
getInstance().test2();
LOG.info("DynamicJob2_SUCCESS");
} catch (Exception e) {
LOG.error("DynamicJob2_FAIL_e=="+e);
}
}
}