当将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()); }  } 

如果客户端PUTcontexts/example资源提供了某些内容,则该方法将使用ManagedExecutorService更新请求范围的ExampleStore bean并异步执行通知。 为了使异步执行能够查找请求范围的存储,我们使用ThreadContext将可运行对象与从原始线程捕获的上下文进行包装。 这样可以确保执行的可运行对象可以使用相应的上下文。

我们必须根据要传播的上下文类型(例如CDItransactionsecurity )配置并产生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

通过MicroProfile上下文传播增强了CDI上下文和隔板相关推荐

  1. php cdi_通过MicroProfile上下文传播增强了CDI上下文和隔板

    php cdi 当将CDI与异步执行方法(例如ManagedExecutorService ,传统上不可能访问在原始线程中处于活动状态的所有CDI范围. MicroProfile Context Pr ...

  2. BCPNet:用于实时语义分割的双向上下文传播网络

    论文地址:https://arxiv.org/pdf/2005.11034.pdf 代码地址:暂无 空间细节和上下文相关性是语义分割的两类关键信息.一般来说,空间细节最可能存在于浅层,而上下文关联最可 ...

  3. J2EE持久层持久化上下文传播总结(续)

    作者:狂放不羁 网址:http://yuquan.blog.51cto.com >>>转载请注明出处!<<< 接着上篇"J2EE事务并发控制策略总结&qu ...

  4. Payara基金会发布全面支持MicroProfile 2.0的5.183版Payara Server和Payara Micro

    Payara基金会最近发布了5.183版Payara Server和Payara Micro,其中包含大量新功能.升级和Bug修复,并开始全面支持MicroProfile 2.0和Java EE 8. ...

  5. 以及其任何超类对此上下文都是未知的_ECCV'20 |OCRNet化解语义分割上下文信息缺失难题...

    编者按:图像语义分割一直都是场景理解的一个核心问题.针对语义分割中如何构建上下文信息,微软亚洲研究院和中科院计算所的研究员们提出了一种新的物体上下文信息--在构建上下文信息时显式地增强了来自于同一类物 ...

  6. weld焊接_玩Weld-Probe –一站式查看CDI的所有方面

    weld焊接 当我坐在DevConf.CZ的会议室时, Weld 3.0.0.Alpha4已发布 . 大约在Jozef Hartinger( @jozefhartinger )旁边或多或少 ,后者在共 ...

  7. 关于Jakarta EE与MicroProfile的创新和关系的提案

    在JCrete非会议上,我们中的一些人正在就Jakarta EE的愿景,尤其是与MicroProfile的关系进行头脑风暴. 我想开始讨论,以使所有人都在同一页面上,尤其是Jakarta EE和Mic ...

  8. php cdi_DI / CDI –基础

    php cdi 简介(DI / CDI基础) 首先,我认为对此会有一些困惑,但事实是,它们是相同的–不同之处在于用法及其用途. DI(依赖项注入)是一个通用术语–此功能基本上是在任何应用程序上进行Be ...

  9. 玩Weld-Probe –一站式查看CDI的所有方面

    焊接3.0.0.Alpha4被释放 ,而我一直坐在在DevConf.CZ一间会议室. Jozef Hartinger( @jozefhartinger )或多或少地在几分钟前告诉我有关此最新版本的新功 ...

最新文章

  1. 史上最简单粗暴获取阿里巴巴iconfont图标,并引用到vant的方法(没有之一)
  2. 基于激光雷达点云的3D目标检测算法—端到端多视图融合
  3. 好书速递 | FPGA原理和结构
  4. c#如何用一个程序打开另一个程序(如:窗体的注销重启)
  5. 固定在计算机主机箱体上,联结计算机各种部件,起桥梁作用的是,2014年12月计算机应用基础模拟试题...
  6. shell字体颜色应用
  7. hbase 单机连接hadoop_Hadoop、Hbase单机环境安装
  8. 第一次训练赛的相关总结和教训!
  9. 前端学习(3188):ant-design的icon图标
  10. Hadoop Mapreduce 调优
  11. 【Python网络爬虫】规则#20181023
  12. PHP设计模式——职责链模式
  13. .netcore signalR 实时消息推送
  14. mysql必需记住的语句_关于MySql的语句
  15. android 爱加密 脱壳,简单尝试脱“爱加密”官网加固的DEX壳
  16. 【C#】万年历源码、农历、节日、节气齐全
  17. QOS概述(一)服务模型
  18. 融资买入:连续10天、7天
  19. 这么用 if-else,小鹿差点被辞退!
  20. Eclipse WTP

热门文章

  1. nssl1148,jzoj5461-购物【可撤回贪心,堆】
  2. 【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)
  3. MST(最小生成树)的构造
  4. Full_of_Boys训练1总结
  5. 五分钟轻松了解Hbase面向列的存储
  6. MySQL 中的重做日志,回滚日志以及二进制日志的简单总结
  7. 使用Docker 实现微服务并搭建博客,一文全掌握
  8. 这可能是最生动的加密相关科普文章
  9. jQuery 基础教程 (一)之jQuery的由来及简介
  10. dom4j读取XML文件内容