Jersey 2.0:创建重复作业

2024-05-05

在我们的 REST-Service 中,我们想要实现一个每 10 秒检查一次的作业。所以我们认为我们可以使用 Quartz 来制作一个涵盖此内容的作业。但问题是,我们需要注入一个单例,因为它在作业中使用,而作业似乎不在我们的服务上下文中,因此注入的类始终为 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 始终为空。


我用过Scheduler上下文映射来实现这一点。你可以试试这个。

在 REST API 中,当我们创建调度程序时,我们可以使用上下文映射将参数传递给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();
        }
    }
}

作业实施

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();
        }
    }

}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jersey 2.0:创建重复作业 的相关文章

  • Emacs 打字骨架对插入也许

    在 Eclipse 中 编辑 Java 代码时 如果我输入一个左括号 我会得到一对括号 如果我然后 输入 第二个括号 它不会插入额外的括号 我如何在 emacs 中得到它 Eclipse 编辑器足够聪明 当我输入闭括号时 它知道我刚刚完成了
  • 如何正确地将MapStruct与Eclipse集成? (包括Lombok java代理)

    我愿意在一些官方项目中使用MapStruct 所以我决定先对其进行一些测试 我需要让它与 eclipse 集成工作 并遵循 MapStruct 网站上提供的所有说明 但是 到目前为止还没有运气 有人成功实现了这种整合吗 如果是的话我可以缺少
  • 如何制作具有两个索引的 Map?

    我在java中有一张这样的地图 Map
  • 匿名类*总是*维护对其封闭实例的引用吗?

    我正在处理一些代码 其中一个对象 foo 正在创建另一个对象 对象 bar 并将其传递给Callable 之后 foo 将返回 bar 然后我希望 foo 变得无法访问 即 可用于 垃圾收集 我最初的想法是创建Callable匿名 例如 c
  • 如何在我的 HttpClient 执行器中遵循单一职责原则?

    我在用RestTemplate http docs spring io spring docs current javadoc api org springframework web client RestTemplate html as
  • Java OR 运算符优先级

    如何在 Java 中以 if 的方式链接条件语句b是假的 不如不检查c If a and c是假的 并且b是真的 确实c会被检查吗 if a b c 我正在寻找 PHP 所拥有的类似功能 但两者之间存在差异OR and 爪哇 如果左操作数是
  • 写入作为 Jar 文件中的资源包含的 Java 属性文件

    有没有办法修改作为资源存储在 Jar 文件中的属性文件中的属性值 这就是我正在尝试处理的场景 我有一个属性文件作为资源存储在我的 Jar 文件中 有一些系统特定的属性 例如路径 我希望能够为我想要运行 Jar 文件的系统更改此设置 最好的解
  • Spring Security登录返回404

    我目前正在使用 Spring 框架开发我的博客 我正在实现 Spring Security 用于登录目的 一切都按预期进行 直到我提交始终返回 404 代码的登录凭据 这是我的 web xml 代码e
  • 在所有方法调用上允许类型见证有什么意义?

    假设我们有两种方法 如下所示 public static
  • 如何使用 C# 调用 REST API?

    这是我到目前为止的代码 public class Class1 private const string URL https sub domain com objects json api key 123 private const str
  • Jackson 中没有注释的多态反序列化

    我有一个CloudEvent
  • Hibernate SET 元素 order-by 子句

    我想知道 我可以平静地接受以下事实 当 fetch select 时 您可以在映射文件中的 SET 元素上设置 order by 属性 但如果您在创建查询时获取所有内容 这样安全吗 我的意思是 他们将结果放入 HashSet 中 我不认为这
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • 在JAVA中将数据写入.txt文件?

    我想知道是否是在JAVA中将计算的数据写入文本文件 我的 JAVA 代码是一个基于 GUI 的 gpa 计算器 我只想添加一个 JButton 和 ActionListener 它将类名 GPA 点和计算出的 GPA 写入 txt 文件 这
  • JList 类型不采用参数类型

    当我尝试编译一些代码时 我不断收到这些错误 CCC java 21 type javax swing JList does not take parameters JList
  • 正确的单元测试技术

    在使用 TDD 时 我发现自己需要测试一个包含查找值的常量 最终 哈希图 请查看更新中出现这种情况的原因 见下文 private static final Map
  • 当键位于父类中时,如何将一对多集合映射到连接的子类

    我想将一对多集合映射到子类 但集合的键是父类的属性 目前我正在映射 AbstractFoo Foo 和 Bar 类 如下所示
  • 如果垃圾收集器没有删除未引用的对象,它们还能运行吗?

    如果一个对象正在等待垃圾收集 但包含一个在该对象的最后一个引用更改时正在运行的线程 那么该线程是否仍会运行并且代码是否仍会执行 那么您是否可能有一堆应该删除的幽灵对象 但它们对您的代码产生了影响 你如何防止这种情况发生 有没有办法让对象知道
  • 在Java中将32bpp图像转换为16bpp图像

    如何使用 Java 库将 32bpp 图像 ARGB 转换为 16bpp 图像 ARGB 出于我的好奇 在像素级别 这种转换有什么作用 如果我有一个保存像素值 包含所有通道 的 int 值 那么在转换发生后该 int 会有什么不同 32 位
  • 只有创建视图层次结构的原始线程才能触摸其视图。在安卓上[重复]

    这个问题在这里已经有答案了 我只是一个初学者 所以请原谅我问一个可能愚蠢的问题 我不明白只有创建视图层次结构的原始线程才能触摸其视图的含义 请有人告诉我为什么会发生此错误以及如何解决此问题 ThankYou 这是我的班级 public cl

随机推荐