Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于挂起的方法调用的Spring缓存_Spring_Caching - Fatal编程技术网

用于挂起的方法调用的Spring缓存

用于挂起的方法调用的Spring缓存,spring,caching,Spring,Caching,假设我正在编写一个由外部应用程序调用的SpringWeb服务。该应用程序请求我需要从外部资源加载的数据。此外,该设计允许它使用不同的参数多次调用我的服务。换句话说,坐在应用程序前面的用户只需按下一个按钮,就可以在很短的时间内生成一系列对我的web服务的请求 我的web服务解析参数并向外部资源提出必要的请求。根据逻辑,它可能会导致反复调用具有相同参数的外部资源,这使得它成为缓存的理想候选 例如: 用户按下应用程序中的一个按钮 应用程序向我的web服务发起十个请求 我的web服务并行地接收它们 在分

假设我正在编写一个由外部应用程序调用的SpringWeb服务。该应用程序请求我需要从外部资源加载的数据。此外,该设计允许它使用不同的参数多次调用我的服务。换句话说,坐在应用程序前面的用户只需按下一个按钮,就可以在很短的时间内生成一系列对我的web服务的请求

我的web服务解析参数并向外部资源提出必要的请求。根据逻辑,它可能会导致反复调用具有相同参数的外部资源,这使得它成为缓存的理想候选

例如:

  • 用户按下应用程序中的一个按钮
  • 应用程序向我的web服务发起十个请求
  • 我的web服务并行地接收它们
  • 在分析了所有请求的参数之后,总的来说,我需要调用外部资源15次,但是这些参数基本上是相等的,只显示三次调用就足以满足15次预期调用
  • 但是,对外部资源的一次调用可能需要一些时间

    据我所知,它将
    @Cachable
    方法的结果写入缓存。显然,这意味着在它使用与缓存命中相同的参数处理该方法的另一次调用之前,它必须具有前一次调用的结果。这意味着它不支持挂起的方法调用

    我需要类似“嘿,我刚才看到一个方法调用使用了相同的参数,但我仍在等待调用的结果。虽然我还不能提供结果,但我将保留该新调用并重新使用该结果。”


    我有什么选择?我可以让Spring这样做吗?

    有很好的理由,你不能让Spring在开箱即用。底线是,使用特定的缓存实现进行锁定和同步非常困难,因此在抽象中尝试这样做有点疯狂。你可以找到一些基本原理和一些讨论

    讨论了如何使用ehcache的
    BlockingCache

    Guava也有这样的功能,但是缓存需要以一种非常特定的方式(使用回调)访问,
    CacheInterceptor
    实际上并不适合。我们的计划仍然是在某个时候让它发挥作用


    不要忘记缓存必须是透明的(即,打开和关闭缓存只会导致性能变化)。试图解析参数并计算应该对web服务进行的调用很有可能导致副作用。也许你应该把东西藏在另一个地方?

    我希望社区有更多的兴趣来得到更积极的答案。我的意思是我清楚地理解你的观点。无论如何,我写了我自己的缓存控制器,它似乎可以工作。如果您认为这适用于Spring的抽象,请随意提出问题或共享一些代码。谢谢。嗯,这完全不是抽象的。不管怎么说,要想融入其余的部分,这有点棘手。