fork/join和线程池

问题:

启用了Spring且其范围设置为Request的缓存需要由不在请求范围内的singleton bean访问。

解:

Spring使您能够创建缓存,该缓存为请求范围保留数据。 例如

 import org.springframework.cache.concurrent.ConcurrentMapCache;  import org.springframework.cache.interceptor.SimpleCacheResolver;  import org.springframework.cache.support.SimpleCacheManager;  import org.springframework.context.annotation.Scope;  import org.springframework.context.annotation.ScopedProxyMode;  import org.springframework.stereotype.Component;  import org.springframework.web.context.WebApplicationContext;  import java.util.ArrayList;  import java.util.Collection;  @Component  @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)  public class RequestScopeCache extends SimpleCacheResolver { public RequestScopeCache() { SimpleCacheManager cacheManager = new SimpleCacheManager(); Collection caches = new ArrayList((Collection) new ConcurrentMapCache( "myCache" , true )); cacheManager.setCaches(caches); cacheManager.initializeCaches(); setCacheManager(cacheManager); }  } 

您可以在要缓存的任何方法周围使用此缓存

 @Cacheable(value = "myCache" , cacheResolver = "requestScopeCache" ) public String getName(String id) { //logic to get name from id } 

现在,如果您从具有请求上下文的任何控制器中调用此方法,那就很好了,即,该方法是从服务Web请求的Spring bean的任何其他方法中调用的。

但是,如果您需要从线程池或fork连接池中调用它,事情就会变得棘手。 假设您收到一个请求,并且需要生成多个线程以同时运行以收集数据以将请求存储到服务器。

这些线程耗尽了Web请求线程的上下文,因此在Web请求线程上设置的任何“线程本地”值将对这些线程不可用。

因此,如果最终从这些池线程中调用上述方法(注释为使用缓存),则会从spring中获取异常,例如:

 Scope 'session' is not active for the current thread ; IllegalStateException: No ; IllegalStateException: No thread -bound request found 

但是有一种简单的方法可以修复它:

  1. 从Web请求线程获取请求属性
 RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); 

2.将此属性传递给来自pool或fork / join的自定义线程。 基本上可以通过在构造函数中使用此属性创建可运行对象来完成

3.在调用标记为使用请求范围缓存的方法之前,设置请求属性

 RequestContextHolder.setRequestAttributes(attributes); 

这将在当前线程的本地线程中设置属性,该属性可用于调用上述方法。

测试用例中的综合要求

现在,如果您正在从junit测试方法,则可能根本没有请求对象。

因此,您可以创建一个并按上述方法使用它来填充要测试的属性

 RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( new DummyRequest())); 

翻译自: https://www.javacodegeeks.com/2020/05/access-spring-request-scope-cache-in-singelton-bean-called-from-fork-join-thread-pool.html

fork/join和线程池

fork/join和线程池_从fork-join /线程池调用的Singelton bean中的访问spring请求范围缓存...相关推荐

  1. 从fork-join /线程池调用的Singelton bean中的访问spring请求范围缓存

    问题: 启用了Spring且将范围设置为Request的缓存需要由不在请求范围内的singleton bean访问. 解: Spring使您能够创建缓存,该缓存为请求范围保留数据. 例如 import ...

  2. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  3. main线程 子线程 顺序_面试官:线程池如何按照core、max、queue的执行顺序去执行?详解...

    前言 这是一个真实的面试题. 前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core.max.queue的执行循序去执行?". 我们都知道线程池中代码执行顺 ...

  4. java线程池和线程实例化_浅谈Java 线程池原理及使用方式

    一.简介 什么是线程池? 池的概念大家也许都有所听闻,池就是相当于一个容器,里面有许许多多的东西你可以即拿即用.java中有线程池.连接池等等.线程池就是在系统启动或者实例化池时创建一些空闲的线程,等 ...

  5. java线程池1001java线程池_深入浅出Java(Android )线程池ThreadPoolExecutor

    前言 关于线程池 在Java/Android开发中,设计到并发的请求,那基本上是离不开线程池了.用线程池的好处: 1.减少线程频繁创建.销毁的开销: 2.好控制并发量,降低OOM的可能,至于原因文中会 ...

  6. python pymysql连接池_杂项之pymysql连接池

    杂项之pymysql连接池 本节内容 本文的诞生 连接池及单例模式 多线程提升 协程提升 后记 1.本文的诞生 由于前几天接触了pymysql,在测试数据过程中,使用普通的pymysql插入100W条 ...

  7. java 线程 暂停_如何实现Java线程的暂停和重新启用?

    展开全部 JAVA中线程开始有start方法,暂停用sleep(time)方法,线程停止用stop方法,线程等待wait方法,java 中没有线程重启一说,只能说线62616964757a686964 ...

  8. python并行线程倒计时_[python 并行2]线程

    线程篇 基本使用 python线程使用的两个模块为: _thread (不推荐再使用). threading (查看threading的源码可以发现,threading实际是对_thread进一步的封 ...

  9. java设计高并发内存池_高并发服务器-连接池的设计

    高并发服务器-连接池的设计 高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒, ...

最新文章

  1. FirewallD 详解
  2. 一次 JVM 调优的笔记
  3. 释疑のCONTEXTS
  4. Java工程师学习步骤
  5. “指定的文件名无效或太长” 无法拷贝,咋办
  6. 最小二乘估计_相关性及最小二乘估计【20201026】
  7. ladder怎么读_ladder 是什么意思_ladder 的翻译_音标_读音_用法_例句_爱词霸在线词典...
  8. (转)Struts2访问Servlet的API及......
  9. mysql binary 查询_MYSQL的binary解决mysql数据大小写敏感问题 《转载》
  10. 天涯明月刀登录的界面服务器显示,上述便是Win10系统下登录天涯明月刀提示异地登录不了的详细解决方法了...
  11. M语言中的操作符说明:数字以及时间相关的操作符
  12. 免费好用的流程图软件yed
  13. PC端,微信扫码实现拨打电话的功能
  14. 计算机作业封面,西南交通大学离线作业封面-2016
  15. 【现代遗传学原理-基因和基因组学】
  16. 如何查看支付宝商户ID(支付宝pid)?
  17. 降低屏幕亮度,减缓眼疲劳 (linux/windows/firefox/android)
  18. 【大牛系列教学】如何准备面试?
  19. Facade模式的介绍
  20. 【计算机组成原理】实验1:运算器

热门文章

  1. Codeforces Round #703 (Div. 2)
  2. P3302 SDOI2013森林
  3. 【每日一题】1月29日题目 和与或
  4. 第1节 连通性强连通、割点和桥 例题
  5. CF1146F: Leaf Partition(树形dp)
  6. 动态区间第k小:树状数组套权值线段树
  7. P7516-[省选联考2021A/B卷]图函数【bfs】
  8. CF573D-Bear and Cavalry【动态dp】
  9. HDU5126 stars(4维偏序->cdq套cdq+树状数组)
  10. Codeforces Round #675 (Div. 2)——F主席树待补?