专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

在Tomcat中启用虚拟线程特性

  前提
  趁着国庆前后阅读了虚拟线程相关的源码,写了一篇《虚拟线程VirtualThread源码透视》,里面介绍了虚拟线程的实现原理和使用示例。需要准备做一下前期准备:安装OpenJDK19或者OracleJDK19准备好嵌入式Tomcat的依赖,需要引入三个依赖包,分别是tomcatembedcore、tomcatembedel和tomcatembedwebsocket,版本选用10。1。0
  查看Tomcat官方文档的CHANGELOG:
  tomcatvirtualthread1
  支持Loom项目的Tomcat最低版本为10。1。0M16,对应的正式版是10。1。0(当前时间为20221007前后),低于此版本因为大量API还没有适配虚拟线程,主要是没有改造监视器锁的引用导致虚拟线程pin到载体(平台)线程等问题,因此别无他选。另外,重要的提醒说三次:本文是实验性质,在未完全证实改造功能可以应用生产环境前需要谨慎评估,或者先别使用于生产环境本文是实验性质,在未完全证实改造功能可以应用生产环境前需要谨慎评估,或者先别使用于生产环境本文是实验性质,在未完全证实改造功能可以应用生产环境前需要谨慎评估,或者先别使用于生产环境引入依赖
  引入以下依赖:dependencygroupIdorg。apache。tomcat。embedgroupIdtomcatembedcoreartifactIdversion10。1。0versiondependencydependencygroupIdorg。apache。tomcat。embedgroupIdtomcatembedelartifactIdversion10。1。0versiondependencydependencygroupIdorg。apache。tomcat。embedgroupIdtomcatembedwebsocketartifactIdversion10。1。0versiondependency编程式初始化Tomcat
  为了使用反射调用一些java。base模块下没开放的依赖包和跟踪虚拟线程栈,程序运行时候加入下面的VM参数:addopensjava。basejava。langALLUNNAMEDaddopensjava。basejava。lang。reflectALLUNNAMEDaddopensjava。basejava。util。concurrentALLUNNAMEDDjdk。tracePinnedThreadsfull
  在IDEA的运行配置中是这个样子:
  tomcatvirtualthread2
  接着编写一个HttpServlet实现:publicclassVirtualThreadHandleServletextendsHttpServlet{privatestaticfinalDateTimeFormatterFORMATTERDateTimeFormatter。ofPattern(yyyyMMddHH:mm:ss。SSS);Overrideprotectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ThreadthreadThread。currentThread();System。out。printf(servicebythreads,isvirtuals,carrierthreads,thread。getName(),thread。isVirtual(),getCurrentCarrierThreadName(thread));resp。setStatus(HttpServletResponse。SCOK);resp。setHeader(ContentType,applicationjson);Stringcontent{time:LocalDateTime。now()。format(FORMATTER)};resp。getWriter()。write(content);}privatestaticStringgetCurrentCarrierThreadName(ThreadcurrentThread){if(currentThread。isVirtual()){try{MethodHandlemethodHandleMethodHandles。privateLookupIn(Thread。class,MethodHandles。lookup())。findStatic(Thread。class,currentCarrierThread,MethodType。methodType(Thread。class));ThreadcarrierThread(Thread)methodHandle。invoke();returncarrierThread。getName();}catch(Throwablee){e。printStackTrace();}}returnUNKNOWN;}}
  该Servlet实现比较简单,就是在控制台打印一些虚拟线程和载体线程的一些信息,然后返回HTTP状态码为200和一个JSON字符展示当前精确到毫秒的时间。接着编写一个main方法初始化Tomcat:publicclassEmbedTomcatVirtualThreadDemo{privatestaticfinalStringSERVLETNAMEVirtualThreadHandleServlet;privatestaticfinalStringSERVLETPATH;设置VM参数:addopensjava。basejava。langALLUNNAMEDaddopensjava。basejava。lang。reflectALLUNNAMEDaddopensjava。basejava。util。concurrentALLUNNAMEDDjdk。tracePinnedThreadsfullparamargsargsthrowsExceptionepublicstaticvoidmain(String〔〕args)throwsThrowable{StringpinModeSystem。getProperty(jdk。tracePinnedThreads);System。out。println(pinmodepinMode);TomcattomcatnewTomcat();Contextcontexttomcat。addContext(,(newFile(。))。getAbsolutePath());Tomcat。addServlet(context,SERVLETNAME,newVirtualThreadHandleServlet());context。addServletMappingDecoded(SERVLETPATH,SERVLETNAME);ConnectorconnectornewConnector();ProtocolHandlerprotocolHandlerconnector。getProtocolHandler();if(protocolHandlerinstanceofAbstractProtocollt;?protocol){protocol。setAddress(InetAddress。getByName(127。0。0。1));protocol。setPort(9091);ThreadFactoryfactoryThread。ofVirtual()。name(embedtomcatvirtualWorker,0)。factory();Classlt;?klassClass。forName(java。util。concurrent。ThreadPerTaskExecutor);MethodHandlemethodHandleMethodHandles。privateLookupIn(klass,MethodHandles。lookup())。findStatic(klass,create,MethodType。methodType(klass,newClass〔〕{ThreadFactory。class}));ExecutorServiceexecutor(ExecutorService)methodHandle。invoke(factory);protocol。setExecutor(executor);}tomcat。getService()。addConnector(connector);tomcat。start();}}
  这里VirtualThreadHandleServlet匹配所有格式的请求路径并且处理所有请求方法类型的请求。默认的虚拟线程调度器没有为虚拟线程设置名称,也就是如果使用Executors。newVirtualThreadPerTaskExecutor()作为Tomcat的线程池是最终调用看到的控制台输出的虚拟线程名称是一个空字符串。所以笔者这里用MethodHandle直接实例化了默认修饰符没有开放访问权限的ThreadPerTaskExecutor类,基于一个自定义的ThreadFactory强制构造了一个自定义ThreadPerTaskExecutor实例。调用main方法启动后见控制台输出:
  tomcatvirtualthread3
  这里确认了Tomcat启动完成侦听127。0。0。1:9091,通过浏览器或者POSTMAN发送任意请求例如http:127。0。0。1:9091foo就能看到响应结果和控制台输出:
  tomcatvirtualthread4
  这里的Tomcat线程池甚至可以设计为一个完全自定义的虚拟线程调度器,可以参考前面一篇文章,这里不再赘述。暂时无法在SpringBoot体系中使用
  由于Servlet规范问题,Tomcat的升级导致一些接口迁移到jakarta。servlet包中,例如jakarta。servlet。Servlet,此时SpringBoot体系即使是最新版本(当前时间为20221007前后,此时最新版本为2。7。4)使用的是还是旧的规范,对应的类是javax。servlet。Servlet,这只是其中一个接口,大部分和HTTP协议或者Servlet规范相关的接口都存在这个包升级不兼容的问题,需要等待SpringBoot升级为embedtomcat10。1。0才能适配虚拟线程。小结
  Demo项目仓库:Github:https:github。comzjcscutframeworkmeshtreemastertomcatvirtualthread
  来源:https:mp。weixin。qq。coms5bbc1QMFEK82sBmeXVm3w

教育缴费,孩子新学期的学费动动手指一键缴纳教育缴费浙里办寒假接近尾声,新学期要来了。孩子开学前有一件事儿不能忘交学费。不管您的孩子是上幼儿园还是中小学或者大学,都可以在浙里办使用教育缴费服务。今年,我省还开通了浙里办APP终于开学啦!孩子的学平险要不要买,又该如何挑选农历正月十五过后,全国迎来开学季,神兽归笼相关话题冲上了微博热搜榜,家长们的不舍之情溢于言表。每到开学季,很多家长会收到致学生家长的一封信,这可能是一份学平险的投保确认单,提醒家长西甲0塞维超皇马8分领跑北京时间2月6日凌晨4点,202223赛季西甲联赛第20轮,领头羊巴塞罗那坐镇主场诺坎普迎战塞维利亚。上半场刚开场,布斯克茨受伤离场下半场,阿尔巴和拉菲尼亚双双传射建功,加维打进一库里左腿胫骨韧带撕裂,将缺阵数周据TheAthletic记者ShamsCharania报道,勇士队超级巨星斯蒂芬库里因左腿伤势预计将缺席数周,核磁共振检查结果显示,他的左腿上胫腓骨韧带和骨间膜部分撕裂,小腿也有挫户外之王山海炮长沙品鉴会圆满举行2月3日,湖南有道山海炮长沙品鉴会圆满举行。大型高性能豪华皮卡户外之王山海炮荣耀登陆,惊艳全场。汽油3。0TV6车型官方指导价为25。88万30。18万元,柴油2。4T车型官方指导剖析吐蕃与唐朝的乐器的传播,以及对中华音乐发展带来怎样的影响在阅读此文前,诚邀您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。引言吐蕃是唐朝周边的一个少数民族,也是唐朝非常重视的一个部落。正是因为重视,唐朝才合众人寿用爱服务,暖心理赔2020年2月,长沙望城Z女士为自己在合众人寿保险公司投保了众康高端医疗险,年交保费711元。2022年10月,Z女士因体检发现双乳肿块,后去医院确诊为乳腺癌。该单服务人员陈彩云经两部门发布商业银行金融资产风险分类办法强调以债务人为中心的风险分类理念央广网北京2月12日消息据中国银保监会11日消息,中国银保监会会同中国人民银行联合制定了商业银行金融资产风险分类办法(以下简称办法),现正式发布。据有关部门负责人介绍,2019年4参与运动有承担风险意愿原标题市民打篮球致十级伤残向球友索赔未获法院支持(引题)参与运动有承担风险意愿(主题)法治时报记者连蒙体育运动带有固有的风险性特点,像参加篮球足球等具有激烈对抗性的体育比赛,参加者上海地铁10号线这些奇奇怪怪的标识是啥?网友猜了半天,地铁回应来了!汉堡1066牙齿1027椰树1010这些上海地铁10号线车厢里奇奇怪怪的标识引发网友破译的热情有网友说数字能对应,但少一位金鱼椰树牙齿汉堡老鼠你说有规律吧,又没规律!还有网友猜测这我家的故事今天除夕。前几天,学生小A没提前告知就来了,我说我们全家都阳了,怕感染你,回去吧。他说我放了东西就走。于是我让小女儿去楼下把东西拿上来,小A告诉她,他今年要和老婆女儿去泰州岳母家过
强师父猜世界杯法国VS摩洛哥,最强黑马还能上演奇迹吗?12。13062法国VS摩洛哥比赛时间12月15日0300这场球赛还需要注意到一个背景,那就是摩洛哥的特殊地理和文化。他们不仅是非洲首支打入4强的球队,也是阿拉伯国家第一次打入4强的球队。摩掀翻联盟第一!等了500多天小卡轰259扎心塔图姆,快船搅局西部北京时间12月13日,快船主场113比93击败战绩联盟第一的凯尔特人,送给后者两连败。莱昂纳德得到25分9篮板6助攻1抢断,乔治得到26分6篮板3助攻。快船卡椒组合终于联手发威了。直击阿根廷半决赛前最后一练梅西全程参加,劳塔罗心情不错视频加载中当地时间12月14日22点,阿根廷与克罗地亚的世界杯半决赛便将在卢塞尔体育场上演。12月13日18点,阿根廷在位于卡塔尔大学的训练基地完成了大战前的最后一次官方训练,新黄1300万,再见湖人!无奈遭四处兜售,在老詹身边你没打出预期表现11胜15负,排名西部倒数第四。东部六连客结束之后,湖人没有完成浓眉最初定下的目标,将球队胜率拉回至50。不过,考虑到湖人输球的三场比赛,其中两场浓眉因为流感无法出战,另外一场浓眉4年1。14亿没戏!范乔丹拒绝8500万续约,球队要求降薪续约猛龙队西亚卡姆本赛季状态火热,场均可以得到25分8。8篮板7。1助攻,数据表现非常全面,帮助球队取得13胜14负战绩排名东部第九,西亚卡姆队崛起让球队再次看到夺冠希望,未来将主要围鸡蛋黄寻常食品滋阴妙药鸡蛋是生活中常见的食品,许多人不知道的是鸡蛋黄还是一味中药,在中医经典著作伤寒论和金匮要略中多次出现,如黄连阿胶汤百合鸡子黄汤和排脓散中均含有鸡蛋黄。鸡蛋黄又名鸡子黄鸡卵黄等,本草送你四种阴阳双补的中成药,帮你助阳固本补肾填精人之根本,源于阴阳,不管是阴虚了,还是阳虚了,都会给身体造成很多的病理现象,今天,贾老师就给大家分享四种阴阳双补的中成药,帮你助阳,固本,补肾,填精!首先第一个,生力胶囊,他是由人越来越多游客不愿住民宿了?这3点原因很到位,希望你别吃亏导语现在大家都已经不用担心吃饱喝足的问题了,因为几乎都能够实现。平时除了工作之外,大家最想要做的事情就是旅游了,这不仅仅非常有意义,还能够受益匪浅。一说到出门旅游,肯定是不可能当天储蓄暴增!双12很冷清的原因找到了今年的双12显得有些冷清。其实,电商销售滑坡在双11就有苗头,所有电商平台都没有公布GMV,这是史上第一次。最新公布的11月金融数据提供了佐证。11月份人民币贷款增加1。21万亿元喝酒后,若身体出现6个现象,说明你不适合喝酒,建议早戒酒古代社会,酒在人们心目当中具有很高的地位,酒能够消毒,治疗血瘀伤口,还可以用来壮胆。尤其是现在有些人会把酒当成养生食材,尤其是冬天的时候,通过喝酒来暖身,其实这种温暖只是暂时的,因都说陈皮能预防羊,具体原因有所考证吗?在这三年期间各类官方机构发布的药方中多次出现陈皮,其中备受市场推崇的新会陈皮在各方的引导下被推上了风口浪尖其实这个说法并非空穴来风,具体的考证是因为陈皮里面含有一种叫橙皮苷的成分,
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网