java - 在 Java 中任务完成之前后台任务然后结束连接(8)

标签 java multithreading concurrency java-8

我花了很多时间研究这个问题,并且有很多方法可以作为 Java 的背景(应该注意,我专门研究 Java 8 解决方案)。

好的,这是我的(一般)情况 - 请注意这是一个示例,所以不要花时间研究它的工作方式/它在做什么:

  • 有人通过 API 调用请求某些东西
  • API 从数据存储中检索一些数据
  • 但是,我想在某些缓存系统中缓存这个聚合响应
  • 我需要调用缓存 API(通过 REST)来缓存此响应
  • 我不想等到此调用完成后再将响应返回给原始 API 调用

一些模糊的代码结构:

@GET
@ // api definitions
public Response myAPIMethod(){
    // get data from datastore
    Object o = getData();

    // submit request to cache data, without blocking
    saveDataToCache();

    // return the response to the Client
    return Response.ok(data).build();
}

在后台运行 saveDataToCache 而无需等待返回 data 的“最佳”(最佳、最安全、标准)方法是什么?请注意,此缓存不应经常发生(可能每秒几次)。

我尝试了几种方法,特别是 CompletableFutures,但是当我输入一些日志记录时,它似乎总是在返回响应之前等待(我没有调用 get)。

基本上,来自客户端的连接可能会在缓存调用完成之前关闭 - 但我希望它已经完成 :) 我不确定规则是否与客户端连接的生命周期内的规则相同。

提前感谢您的任何建议,如果有任何不清楚的地方,请告诉我...我试图以一种对于那些不了解我正在尝试做的事情(我不能透露)的人可以理解的方式来定义它。

最佳答案

你可以考虑adding要缓存到 BlockingQueue 中的对象并有一个单独的线程 taking从队列中取出并存储到缓存中。

关于java - 在 Java 中任务完成之前后台任务然后结束连接(8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28661922/

相关文章:

java - 如何在没有分块响应的纯 Java 项目中发送 Play Framework 中的 InputStream?

linux - pthread_detach() 在 64 位 Linux 上导致 SIGSEGV

c# - Entity Framework 线程安全

java - java中有BlockingMap和BlockingQueue吗?

java - JAXB 注释

java - 如何在不同的 ImageView 中设置不同的裁剪图像

java - 为什么 Charset.encoder 在转换这个字符数组时添加空值?

c++ - 链接到 DLL 的未处理异常

java - 使用 10 个并行线程查找数组中的最大值

c# - 为什么 ConcurrentBag<T> 在 .Net (4.0) 中这么慢?我做错了吗?