play framework 1 中执行一个耗时长的job操作,怎么防止重复请求?

新手上路,请多包涵

play1 中执行一个耗时长的job操作,为了防止重复请求 job中 Cache.set(order.id, true) 执行代码 Cache.delete(order.id);

    if (Cache.get(order.id)!=null) {
        fail("执行中");
    }

这样可行吗?服务器好像不行,本地测试可以

阅读 2k
1 个回答

可以采用异步的写法,如 CompletableFuture.runAsync(), 然后声明一个 volatile boolean 变量控制状态来标识是否任务在执行, 如:

volatile boolean flag = false;

void func(){
    if (!flag) {
        CompletableFuture.runAsync(() -> {
            try {
                flag = true;
                doWork();
            } finally {
                flag = false;
            }
        });
    } else {
        failWork();
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题