代码之家  ›  专栏  ›  技术社区  ›  rcanovas

如何在Playframework 2.5上启动并定期调用函数

  •  0
  • rcanovas  · 技术社区  · 8 年前

    我需要做一个 WS

    如果你想要一些这样的代码:

    // login data
      ObjectNode tvdbaccount = Json.newObject();
      tvdbaccount.put("apikey", "*****");
      tvdbaccount.put("username", "*****");
      tvdbaccount.put("userkey", "*****");
    
      // try to login
      String token = "";
      CompletionStage<JsonNode> request = WS.url("https://api.thetvdb.com/login")
                                            .post(tvdbaccount)
                                            .thenApply(WSResponse::asJson);
    
      try {
        JsonNode response = request.toCompletableFuture()
                                   .get(5, TimeUnit.SECONDS);
    
        token = response.get("token").asText();
      } catch (Exception ex) {
        System.out.println(ex.getMessage());
      }
    

    该令牌将在24小时后到期,因此我希望每12小时调用一个函数来刷新该令牌。该函数类似于前一个,它只是一个WS-请愿。

    playframework 2.5 哪里 GlobalSettings

    1 回复  |  直到 8 年前
        1
  •  1
  •   rcanovas    8 年前

    多亏了亚历山大B,我能得到我想要的。

    渴望独生子女

    我决定 on start 函数调用 eager singleton .

    我所做的是一个TVDB的类,重要的是在开始时写下你想做的事情 在构造函数内部 bind 它在一个模块上:

    bind(TVDB.class).asEagerSingleton();
    

    阿卡演员

    对于 periodically 函数调用:我使用了 Akka actor .

    我已经实现了一个演员 自称 每12小时一次,所以我将调度代码放在同一个演员的 preStart 无效的我认为Playframework文档 Scheduling asynchronous tasks 没有更新,也没有按原来的方式工作(至少对我来说)。

    bindActor(TVDBActor.class, "TVDBActor");
    

    如果有人需要演员代码,这里是:

    public class TVDBActor extends UntypedActor {
    
      @Inject
      public void preStart(final ActorSystem system, @Named("TVDBActor") ActorRef tvdbActor) {
        system.scheduler().schedule(
          Duration.create(12, TimeUnit.HOURS),
          Duration.create(12, TimeUnit.HOURS),
          tvdbActor,
          "tick",
          system.dispatcher(),
          null
        );
      }
    
      @Override
      public void onReceive(Object msg) throws Exception {
        TVDB.refreshToken();
      }
    
    }