php cdi_通过MicroProfile上下文传播增强了CDI上下文和隔板
php cdi
当将CDI与异步执行方法(例如ManagedExecutorService
,传统上不可能访问在原始线程中处于活动状态的所有CDI范围。 MicroProfile Context Propagation可以定义线程执行上下文并将其传递到完成阶段,尽管我们的代码是异步执行的,但它们仍可以访问各种CDI上下文。 另外,Context Propagation允许创建托管的执行器服务,该服务可以注入到我们的bean中并在其中使用,例如实现舱壁。
增强的CDI上下文
让我们创建并使用在处理请求期间使用的请求范围的Bean。 使用普通的CDI,我们将无法在异步执行中访问和查找bean。
看下面的代码:
@ApplicationScoped @Path ( "contexts/example" ) public class ThreadContextExampleResource { @Inject ExampleStore exampleStore; @Inject ThreadContext threadContext; @Resource ManagedExecutorService mes; @Inject Notifier notifier; @PUT public void setExample(String example) { exampleStore.setExample(example); mes.execute(threadContext.contextualRunnable(notifier::notifyAbout)); } }
@RequestScoped public class ExampleStore { private String example; public String getExample() { return example; } public void setExample(String example) { this .example = example; } }
public class Notifier { @Inject ExampleStore exampleStore; public void notifyAbout() { System.out.println( "New example: " + exampleStore.getExample()); } }
如果客户端PUT
某些内容包含到contexts/example
资源中,则该方法将使用ManagedExecutorService
更新请求范围的ExampleStore
bean并异步执行通知。 为了使异步执行能够查找请求范围的存储,我们使用ThreadContext
将可运行对象与从原始线程捕获的上下文一起包装。 这样可以确保执行的可运行对象可以使用相应的上下文。
我们必须根据要传播的上下文类型(例如CDI , transaction , security )配置并产生ThreadContext
:
public class ThreadContextProducer { @Produces ThreadContext threadContext() { return ThreadContext.builder() .propagated(ThreadContext.ALL_REMAINING) .build(); } }
本示例将所有上下文类型传播到包装的执行中。 然后,我们的bean注入并使用产生的ThreadContext
。
使用执行程序定义舱壁
MicroProfile Context Propagation允许创建和配置ManagedExecutor
,这是类似于ManagedExecutorService
的容器管理的执行器服务。 我们可以通过编程方式创建ManagedExecutor
,对允许的并发设置约束,并定义上下文传播。
通过使用专用执行器来实现特定功能,我们可以实现隔板模式,类似于使用MicroProfile Fault Tolerance或Porcupine 。
让我们定义以下异步JAX-RS资源:
@ApplicationScoped @Path ( "bulkheads" ) public class BulkheadExampleResource { @Inject ExampleStore exampleStore; @Inject Notifier notifier; @Inject ManagedExecutor writeExecutor; @Inject ManagedExecutor readExecutor; @GET public CompletionStage<String> example() { return readExecutor.supplyAsync(exampleStore::getExample); } @PUT public CompletionStage<Void> setExample(String example) { return writeExecutor.runAsync(() -> { exampleStore.setExample(example); writeExecutor.execute(notifier::notifyAbout); }); } }
我们正在注入两个专用的执行器,它们用于运行相应的功能。 执行者是使用生产者创建的:
public class ManagedExecutorProducer { @Produces ManagedExecutor managedExecutor() { return ManagedExecutor.builder() .propagated(ThreadContext.CDI, ThreadContext.APPLICATION) .maxAsync( 4 ) .maxQueued( 4 ) .build(); } public void disposeManagedExecutor( @Disposes ManagedExecutor managedExecutor) { managedExecutor.shutdownNow(); } }
我们的执行者将具有四个同时执行的完成阶段和四个任务的上限。 CDI和应用程序上下文类型的上下文将传播到执行线程。
注入执行程序时,请注意注入点的范围; 这里我们使用的是应用程序范围的资源,否则我们可能会创建两个以上的执行程序,这将违反隔板模式的目的。 由于我们使用的是CDI,因此,如果应以不同的方式配置所创建的执行程序,则当然可以定义其他限定符。
您可以使用最新版本的Open Liberty试用MicroProfile Context Propagation。 我已经在GitHub上发布了示例存储库。
当我们在Open Liberty上运行应用程序时,MicroProfile Context Propagation执行程序将由自动调整的全局线程池提供支持。 你可以看看由自由所提供的默认线程池的指标,如图所示这里 。
更多资源
- GitHub示例项目
- MicroProfile上下文传播
- 开放自由中的上下文传播支持
- 使用Prometheus和Grafana监视开放自由
翻译自: https://www.javacodegeeks.com/2019/08/enhanced-cdi-contexts-bulkheads-microprofile-context-propagation.html
php cdi
php cdi_通过MicroProfile上下文传播增强了CDI上下文和隔板相关推荐
- 通过MicroProfile上下文传播增强了CDI上下文和隔板
当将CDI与异步执行方法(例如ManagedExecutorService ,传统上不可能访问在原始线程中处于活动状态的所有CDI范围. MicroProfile Context Propagatio ...
- BCPNet:用于实时语义分割的双向上下文传播网络
论文地址:https://arxiv.org/pdf/2005.11034.pdf 代码地址:暂无 空间细节和上下文相关性是语义分割的两类关键信息.一般来说,空间细节最可能存在于浅层,而上下文关联最可 ...
- J2EE持久层持久化上下文传播总结(续)
作者:狂放不羁 网址:http://yuquan.blog.51cto.com >>>转载请注明出处!<<< 接着上篇"J2EE事务并发控制策略总结&qu ...
- 以及其任何超类对此上下文都是未知的_ECCV'20 |OCRNet化解语义分割上下文信息缺失难题...
编者按:图像语义分割一直都是场景理解的一个核心问题.针对语义分割中如何构建上下文信息,微软亚洲研究院和中科院计算所的研究员们提出了一种新的物体上下文信息--在构建上下文信息时显式地增强了来自于同一类物 ...
- 关于Jakarta EE与MicroProfile的创新和关系的提案
在JCrete非会议上,我们中的一些人正在就Jakarta EE的愿景,尤其是与MicroProfile的关系进行头脑风暴. 我想开始讨论,以使所有人都在同一页面上,尤其是Jakarta EE和Mic ...
- 语义分割双料冠军!微软 OCRNet化解语义分割上下文信息缺失难题|ECCV 2020
编者按:图像语义分割一直都是场景理解的一个核心问题.针对语义分割中如何构建上下文信息,微软亚洲研究院和中科院计算所的研究员们提出了一种新的物体上下文信息--在构建上下文信息时显式地增强了来自于同一类物 ...
- 总结 62 种在深度学习中的数据增强方式
数据增强 数据增强通常是依赖从现有数据生成新的数据样本来人为地增加数据量的过程 这包括对数据进行不同方向的扰动处理 或使用深度学习模型在原始数据的潜在空间(latent space)中生成新数据点从而 ...
- Payara基金会发布全面支持MicroProfile 2.0的5.183版Payara Server和Payara Micro
Payara基金会最近发布了5.183版Payara Server和Payara Micro,其中包含大量新功能.升级和Bug修复,并开始全面支持MicroProfile 2.0和Java EE 8. ...
- CGMM 基于上下文的马尔可夫模型
github代码:https://github.com/diningphil/CGMM 1. Introduction 结构域学习处理不同大小和拓扑结构.数量的数据,来在模型中识别.合成.嵌入结构化关 ...
最新文章
- 【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
- Eclipse4JavaEE安装SpringBoot
- JavaMail基本使用
- 在linux中 如何创建磁盘配额,如何在Linux系统中配置磁盘配额?
- Android 蓝牙开发(2)——低功耗蓝牙
- MSSQL数据库中row_number()函数
- docker安装mysql redis_使用docker安装mysql和redis
- 小爱同学app安卓版_小爱同学app下载_小爱同学官网版手机客户端下载 安卓版 V2.8.60 - 罐头安卓网...
- 【IE插件】--如何制作?
- marlin固件烧录教程_Marlin固件的步进电机控制代码解析
- Unity3D陀螺仪的使用
- 2021年下半年软件设计师上午真题答案及解析(三)
- 提高scrapy的爬取速度
- 解决hbase客服端连接服务端不报错就是一直连不上的问题
- 武器瞄准镜 - MOD和相关程序讲解
- js制作的炫酷3D太阳系行星运行效果
- python判断座位号_利用Python实现图书馆座位抓取(自动预约),python,抢座
- 解决:Parameter 0 of constructor in xxx required a bean of type ‘xxx‘ that could not be found.
- 天融信上网行为管理短信对接教程
- 日复一日,年复一年,祝我們都好在新的一年.
热门文章
- Acwing 276. I-区域
- 牛客题霸 [ 最长递增子序列] C++题解/答案
- Codeforces Round #764 (Div. 3)
- [SNOI2017]遗失的答案 (FWT)
- YBTOJ:字符匹配(KMP)
- P7137-[THUPC2021 初赛]切切糕【dp】
- 欢乐纪中B组周五模拟赛【2019.3.8】
- jzoj4244-yi【贪心】
- nssl1195-健美猫【???】
- 12、play整合Akka