泽西岛2.0:创造重复的工作

时间:2015-06-01 14:02:56

标签: java rest jersey quartz-scheduler

在我们的REST服务中,我们希望实现一个每10秒检查一次的工作。所以我们认为我们可以使用Quartz制作一个涵盖这个的Job。但问题是,我们需要注入一个单例,因为它在作业中使用,并且作业似乎不在我们的服务上下文中,因此注入的类始终为null(NullPointerException)。

在没有使用Quartz的情况下,还有另一种可能的解决方案来实现这样的工作吗?我们已经尝试编写自己的JobFactory来连接作业和BeanManager,但它根本没用。

这是无法正常工作的代码:

@Stateless
public class GCEStatusJob  implements Job, Serializable{

    private Logger log = LoggerFactory.getLogger(GCEStatusJob.class);

    @Inject
    SharedMemory sharedMemory;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        GoogleComputeEngineFactory googleComputeEngineFactory = new GoogleComputeEngineFactory();

        List<HeartbeatModel> heartbeatList = new ArrayList<>(sharedMemory.getAllHeartbeats());
        List<GCE> gceList = googleComputeEngineFactory.listGCEs();
        List<String> ipAddressList = gceList.stream().map(GCE::getIp).collect(Collectors.toList());

        for(HeartbeatModel heartbeat : heartbeatList){
            if(ipAddressList.contains(heartbeat.getIpAddress())){
                long systemTime = System.currentTimeMillis();

                if(systemTime-heartbeat.getSystemTime()>10000){
                    log.info("Compute Engine mit IP "+heartbeat.getIpAddress()+" antwortet nicht mehr. Wird neu gestartet!");
                    String name = gceList.stream().filter((i) -> i.getIp().equals(heartbeat.getIpAddress())).findFirst().get().getName();
                googleComputeEngineFactory.resetGCE(name);
                }
            }
        }
    }
}

SharedMemory始终为null。

1 个答案:

答案 0 :(得分:0)

我已使用Scheduler上下文映射来实现此目的。你可以试试这个。

在我们创建调度程序的REST API中,我们可以使用Context映射将参数传递给Job

@Path("job")
public class RESTApi {
    private String _userID;

    public String get_userID() {
        return _userID;
    }

    public void set_userID(String _userID) {
        this._userID = _userID;
    }
    @GET
    @Path("/start/{userId}")
    public void startJob(@PathParam("userId") String userID) {
        _userID = userID;
        try {
            SimpleTrigger trigger = new SimpleTrigger();
            trigger.setName("updateTrigger");
            trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
            trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
            trigger.setRepeatInterval(1000);
            JobDetail job = new JobDetail();
            job.setName("updateJob");
            job.setJobClass(GCEStatusJob.class);
            Scheduler scheduler = new StdSchedulerFactory().getScheduler();
            scheduler.getContext().put("apiClass", this);
            scheduler.start();
            scheduler.scheduleJob(job, trigger);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

JOB实施

public class GCEStatusJob implements Job {
    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        RESTApi apiClass;
        try {
            apiClass = ((RESTApi) arg0.getScheduler().getContext().get("apiClass"));
            System.out.println("User name is" + apiClass.get_userID());
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

}

如果我的理解是错误的,请纠正我。