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

问题:

启用了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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux终止mysql进程_Ubuntu Linux下定时监测MySQL进程终止时自动重启的方法

前言最近发现MySQL服务隔三差五就会挂掉,导致我的网站和爬虫都无法正常运作。自己的网站是基于MySQL,在做爬虫存取一些资料的时候也是基于MySQL,数据量一大了,MySQL它就有点受不了了,时不时会崩掉,虽然我自…

系统错误null是什么意思_为什么NULL是错误的?

系统错误null是什么意思Java中NULL用法的简单示例: public Employee getByName(String name) {int id database.find(name);if (id 0) {return null;}return new Employee(id); }这种方法有什么问题? 它可能返回NULL而不是对象-这是错误的。 在面向对…

mysql数据库版本不同_mysql数据库版本不同所引起的问题

1.sql_mode不同所引起的问题mysql5.7 ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column lhh.lhh.id which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode…

线性搜索或顺序搜索算法在Java中如何工作? 示例教程

大家好,我之前谈到了二进制搜索算法的工作原理,并分享了在Java中实现二进制搜索的代码。 在那篇文章中,有人问我是否还存在其他搜索算法? 如果数组中的元素未排序,又如何使用二进制搜索算法,该如何搜索呢&a…

junit规则_JUnit规则

junit规则介绍 在本文中,我想展示一个示例,说明如何使用JUnit Rule简化测试。 最近,我继承了一个相当复杂的系统,并未对所有内容进行测试。 甚至经过测试的代码也很复杂。 通常,我看到缺乏测试隔离。 (我将…

mysql server 5.0安装教程_MySQL Server 5.0安装教程

运行MySQL Server 5.0安装程序“setup.exe”,出现如下界面:安装向导启动,按“Next”继续:选择安装类型,为了方便熟悉安装过程,我们选择“Custom”。按“Next”继续:在“Developer Components”上…

Kubernetes集群上的Apache Ignite和Spring第2部分:Kubernetes部署

以前,我们已经成功创建了第一个由Apache Ignite支持的Spring boot Application。 在此博客上,我们将重点介绍Kubernetes方面需要做的事情,以便能够启动我们的应用程序。 如先前博客所述,我们需要制定我们的Kubernetes RBAC策略。…

centos6.5 安装多个mysql_在centos6,5(64位)系统安装多实例mysql5.6

首先你安装个单实例的mysql试一试一 检查你电脑之前是否装了mysqlrpm -qa | grep mysql这条命令只是查看你系统是否使用过yum或者rpm包安装mysql,对用源码包安装的mysql是查不到的,所以基本用不到二 安装编译所需的包yum -y install make gcc-c cmake bi…

hibernate jpa_JPAHibernate替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?...

hibernate jpa你好!你好吗? 今天我们将讨论不建议使用JPA / Hibernate的情况。 在JPA领域之外,我们还有哪些选择? 我们将谈论的是: JPA /Hibernate问题 解决一些JPA /Hibernate问题的方法 选择此处描述的框架的标准…

mysql中常见查询表_MySQL中常见查询

1 --1、查询“001”课程比“002”课程成绩高的所有学生的学号;2 SELECT a.s FROM sc a,sc b WHERE a.sb.s AND a.c1 AND b.c2 AND a.score >b.score;3 --2、查询平均成绩大于60分的同学的学号和平均成绩;4 SELECT student.s,avg(score) FROM student,…

约束流–没有Drools规则语言的现代Java约束

传统上,要使用OptaPlanner进行扩展,您必须学习DRL。 不再。 借助受Java 8 Streams和SQL启发的新Constraints Streams API,您现在可以用Java (或Kotlin或Scala) 编写约束,并且仍然可以从增量计算中受益。 在…

mysql数据库杀掉堵塞_Mysql解决USE DB堵塞详解

遇到故障,我们往往想的是如何解决这个故障,而不是从故障的根本去思考出现这个故障的原因?这样的结果,只能使我们得到了鱼,失去了渔。今天,我们就来分享一个由USE DB堵塞故障引发的思考案例。故障描述今天一…

java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高

java拦截器项目应用在开发具有某些性能要求的Java EE应用程序时,必须在每个发行版之前验证是否满足这些要求。 您可能会想到,哈德森的一项工作每天晚上在某些特定的硬件平台上执行一系列测试测量。 您可以检查已实现的时间并将它们与给定的要求进行比较…

iis web.config 配置 经典模式_django部署在iis下,webconfig错误

django部署在iis下,webconfig错误错误原因:iis7以后,web.config管理机制更安全了默认情况下,会锁住配置项,不许修改怎么办?如何求解以上问题呢?D:django_websiteshello>%windir%C:Windows 不…

如何在Java中验证电话号码(正则表达式+ Google libphonenumber)

关于如何在不同国家(例如美国,美国)使用Java验证电话号码的快速指南。 带有正则表达式和Google libphonenumber API的示例程序。 1.简介 在本教程中,我们将学习如何在java中验证电话号码 。 这主要是为了验证美国和印度的国家/地…

mysql该账户已存在_mysql 查看函数的所属用户和已存在的函数

复现方式:Delete FROM user Where Usertest and Host%;flush privileges;修复流程:1.用root用户删除两个函数,语句分别为DROP FUNCTION IF EXISTS currval;DROP FUNCTION IF EXISTS nextval;2.然后用程序用户(sharding_slave)创建函数&#x…

joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会

joo工作流越来越多的人通过为他们的业务采用功能性编程来赶上我们平台的最新更新。 在Data Geekery ,我们将Java 8用于jOOQ集成测试,因为将新的Streams API与lambda表达式一起使用使生成临时测试数据变得非常容易。 但是, 我们并不认为JDK提…

session mysql登录实现_PHP+MYSQL+MYSQL+SESSION实现用户登录的实例

这是我写的用户登录界面。session_start();include(menu2.php);require(configywcl.php);//加载配置文件require(functions.php);?>请登录系统if ($username){$passwordmd5($password);$sql"select * from user where username$username and password$password";…

使用OpenSSL加密,使用Java解密,使​​用OpenSSL RSA公钥

抽象 在2017年,我撰写了一个由三部分组成的系列文章,内容涉及选择最佳的哈希和加密算法。 在对该系列进行研究时,我学到了很多有关哈希和加密的知识。 我学到的最重要的事情是,尽管我必须对如何使用最安全的算法进行自我教育&…

axture动画原型制作_Axure制作原型-基础操作

产品原型从类型可以分为手稿、线框图、低保真、高保真几种效果,在制作的时候分为不同场景来决定我们的输出物类型。比如在会议中为了快速的确定产品规划方向,迅速的记录及表达出当前灵感的碰撞,这个时候通常使用手稿的形式快速绘制&#xff0…