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上下文和隔板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apache kafka_使用Apach
- 下一篇: Linux退出Vim(linux的vim