java ee api_Java EE并发API教程

java ee api

这是一个示例章节,摘自Francesco Marchioni编辑的WildFly上的实用Java EE 7开发 。

本章讨论了新的Java EE并发API(JSR 236) ,它概述了使用一组托管资源在Java EE容器上并行执行任务的标准方法。 为了描述如何在您的应用程序中使用此API,我们将遵循以下路线图:

  • 并发实用工具简介
  • 如何使用ManagedExecutorService利用异步任务
  • 如何使用ManagedScheduledExecutorService在特定时间安排任务
  • 如何创建动态代理对象,以添加Java EE环境中可用的上下文信息
  • 如何使用ManagedThreadFactory创建托管线程以供您的应用程序使用

并发实用工具概述

在Java EE 7之前,在Java EE容器中执行并发任务是众所周知的危险做法,有时甚至被容器禁止:

“企业bean不得尝试管理线程。 企业bean不得尝试启动,停止,挂起或恢复线程,也不能尝试更改线程的优先级或名称。 企业bean不得尝试管理线程组”

实际上,通过使用J2SE API在Java EE容器中创建自己的非托管线程,将无法保证将容器的上下文传播到执行任务的线程。

唯一可用的模式是使用异步EJB消息驱动Bean ,以便以异步方式执行任务。 通常,这足以用于简单的触发和遗忘模式,但对Threads的控制仍位于Container的手中。

通过Java EE并发API(JSR 236),您可以将java.util.concurrent API的扩展用作托管资源 ,即由Container进行管理。 与标准J2SE编程的唯一区别是,您将从容器的JNDI树中检索托管资源。 但是,您仍将使用属于java.util.concurrent包的一部分的Runnable接口或类,例如FutureScheduledFuture

在下一节中,我们将从最简单的示例开始,该示例使用ManagedExecutorService执行异步任务。

使用ManagedExecutorService提交任务

为了创建我们的第一个异步执行,我们将展示如何使用ManagedExecutorService ,它扩展了Java SE ExecutorService以提供用于提交要在Java EE环境中执行的任务的方法。 通过使用此托管服务,容器的上下文将传播到执行任务的线程:ManagedExecutorService包含在应用程序服务器的EE配置中:

<subsystem xmlns="urn:jboss:domain:ee:2.0">. . .<concurrent>. . . .<managed-executor-services><managed-executor-service name="default"jndi-name="java:jboss/ee/concurrency/executor/default"context-service="default" hung-task-threshold="60000"core-threads="5" max-threads="25" keepalive-time="5000"/></managed-executor-services>. . . .</concurrent></subsystem>

为了创建我们的第一个示例,我们从容器的JNDI上下文中检索ManagedExecutorService,如下所示:

@Resource(name = "DefaultManagedExecutorService")ManagedExecutorService executor;

通过使用ManagedExecutorService实例,您可以提交可以实现java.lang.Runnable接口或java.util.concurrent.Callable接口的任务。

Callable接口提供了一种call()方法,该方法可以返回任何泛型类型,而不是使用run()方法。

编写一个简单的异步任务

因此,让我们看一个简单的Servlet示例,该示例使用ManagedExecutorService触发异步任务:

@WebServlet("/ExecutorServlet")public class ExecutorServlet extends HttpServlet {@Resource(name = "DefaultManagedExecutorService")ManagedExecutorService executor;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  PrintWriter writer = response.getWriter();           executor.execute(new SimpleTask());          writer.write("Task SimpleTask executed! check logs");      }}

在我们的示例中,类SimpleTask通过提供并发执行来实现Runnable接口。

public class SimpleTask implements Runnable {@Overridepublic void run() {System.out.println("Thread started.");}}

从异步任务中检索结果

上述任务是脚踏实地的好选择; 正如您可能已经注意到的那样,无法拦截Task的返回值。 另外,在使用Runnable时,您必须使用不受限制的异常(如果run( 抛出了一个检查的异常,谁会捕获它呢?)您无法将run()调用封装在处理程序中,因为您没有编写调用它的代码)。

如果你想克服这个限制,那么你可以实现一个java.util.concurrent.Callable接口相反,它提交给ExecutorService的,并与等待结果FutureTask.isDone()的返回ExecutorService.submit()

让我们看一下Servlet的新版本,它捕获了一个名为CallableTask的Task的结果:

@WebServlet("/CallableExecutorServlet")public class CallableExecutorServlet extends HttpServlet {@Resource(name = "DefaultManagedExecutorService")ManagedExecutorService executor;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter writer = response.getWriter();Future<Long> futureResult = executor.submit(new CallableTask(5));                    while (!futureResult.isDone()) {// Waittry {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}try {writer.write("Callable Task returned " +futureResult.get());} catch ( Exception e) {e.printStackTrace();} }}

从代码中可以看到,我们正在使用isDone( 方法轮询任务完成情况。 任务完成后,我们可以调用FutureTask的get( 方法并获取返回值。

现在,让我们看一下我们的CallableTask实现,在我们的示例中,该实现返回一个数字总和的值:

public class CallableTask implements Callable<Long> {private int id;public CallableTask(int id) {this.id = id;}public Long call() {long summation = 0;for (int i = 1; i <= id; i++) {summation += i;}return new Long(summation);}}

在我们的示例中,我们要做的就是实现call方法,该方法返回Integer,该Integer最终将通过Future接口的get方法来收集。

如果您的Callable任务引发了Exception,则FutureTask.get()也将引发Exception,并且可以使用Exception.getCause()来访问原始Exception。

监视未来任务的状态

在上面的示例中,我们正在使用FutureTask.isDone()方法检查Future Task的状态。 如果需要对Future Task生命周期进行更准确的控制,则可以实现javax.enterprise.concurrent.ManagedTaskListener实例,以便接收生命周期事件通知。

这是我们增强的Task,它实现了taskSubmittingtaskStartingtaskDonetaskAborted方法:

public class CallableListenerTask implements Callable<Long>,ManagedTaskListener {private int id;public CallableListenerTask(int id) {this.id = id;}public Long call() {long summation = 0;for (int i = 1; i <= id; i++) {summation += i;}return new Long(summation);}public void taskSubmitted(Future<?> f, ManagedExecutorService es,Object obj) {System.out.println("Task Submitted! "+f);}public void taskDone(Future<?> f, ManagedExecutorService es, Object obj,Throwable exc) {System.out.println("Task DONE! "+f);}public void taskStarting(Future<?> f, ManagedExecutorService es,Object obj) {System.out.println("Task Starting! "+f);}public void taskAborted(Future<?> f, ManagedExecutorService es,Object obj, Throwable exc) {System.out.println("Task Aborted! "+f);}}

生命周期通知按以下顺序调用:

  • taskSubmitting :关于将任务提交给执行者
  • taskStarting :在实际启动任务之前
  • taskDone :任务完成时触发
  • taskAborted :当用户调用futureResult.cancel()时触发

在异步任务中使用事务

在分布式Java EE环境中,要确保并发任务执行也能正确执行事务,这是一项艰巨的任务。 Java EE并发API依靠Java事务API(JTA)通过javax.transaction.UserTransaction来支持其组件顶部的事务,该操作用于显式划分事务边界。

以下代码显示可调用任务如何从JNDI树中检索UserTransaction,然后启动并提交与外部组件(EJB)的事务:

public class TxCallableTask implements Callable<Long> {long id;public TxCallableTask(long i) {this.id = i;}public Long call() {long value = 0;UserTransaction tx = lookupUserTransaction();SimpleEJB ejb = lookupEJB();try {tx.begin();value = ejb.calculate(id); // Do Transactions heretx.commit();} catch (Exception e) {e.printStackTrace();try {  tx.rollback(); } catch (Exception e1) {        e1.printStackTrace(); }}return value;}// Lookup EJB and UserTransaction here ..}

这种方法的主要局限性在于,尽管上下文对象可以开始,提交或回滚事务,但是这些对象无法加入父组件事务。

使用ManagedScheduledExecutorService安排任务

ManagedScheduledExecutorService扩展了Java SE ScheduledExecutorService以提供用于提交延迟或定期任务以在Java EE环境中执行的方法。 至于其他托管对象,您可以通过JNDI查找获得ExecutorService的实例:

@Resource(name ="DefaultManagedScheduledExecutorService")
ManagedScheduledExecutorService scheduledExecutor;

一旦有了对ExecutorService的引用,便可以在其上调用schedule方法以提交延迟或定期的任务。 就像ManagedExecutors一样,ScheduledExecutors也可以绑定到Runnable接口或Callable接口。 下一节将介绍这两种方法。

提交一个简单的ScheduledTask

以最简单的形式提交计划任务需要设置计划表达式并将其传递给ManagedSchedulerExecutor服务。 在此示例中,由于调用了schedule( 方法,我们将创建一个延迟的任务,该任务仅在10秒内运行一次:

@WebServlet("/ScheduledExecutor")
public class ScheduledExecutor extends HttpServlet {@Resource(name ="DefaultManagedScheduledExecutorService")ManagedScheduledExecutorService scheduledExecutor;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter writer = response.getWriter();           ScheduledFuture<?> futureResult = scheduledExecutor.schedule(new SimpleTask(),       10,TimeUnit.SECONDS);writer.write("Waiting 10 seconds before firing the task");}}

如果需要重复计划任务,则可以使用scheduleAtFixedRate方法,该方法将触发任务之前的时间,每次重复执行之前的时间和TimeUnit作为输入。 请参阅以下示例,该示例在初始延迟1秒后每10秒秒调度一次任务:

ScheduledFuture<?> futureResult = scheduledExecutor. scheduleAtFixedRate (new SimpleTask(),1, 10,TimeUnit.SECONDS);

捕获计划执行的结果

如果需要从计划执行的任务中获取返回值,则可以使用schedule方法返回的ScheduledFuture接口。 这是一个示例,它捕获了我们先前编码的阶乘示例Task的结果:

ScheduledFuture<Long> futureResult =scheduledExecutor.schedule(new CallableTask(5), 5, TimeUnit.SECONDS);                 while (!futureResult.isDone()) {       try {Thread.sleep(100); // Wait} catch (InterruptedException e) {                   e.printStackTrace();}}     try {writer.write("Callable Task returned " +futureResult.get());} catch ( Exception e) {e.printStackTrace();}

使用ManagedThreadFactory创建托管线程

javax.enterprise.concurrent.ManagedThreadFactory等效于J2SE ThreadFactory,可用于创建自己的线程。 为了使用ManagedThreadFactory,您需要照常从JNDI注入它:

@Resource(name ="DefaultManagedThreadFactory")ManagedThreadFactory factory;

从工厂创建自己的托管线程(与ManagedExecutorService创建的托管线程相比)的主要优点是,您可以设置一些典型的线程属性(例如名称或优先级),并且可以创建J2SE Executor服务的托管版本。 。 以下示例将向您展示如何。

从工厂创建托管线程

在此示例中,我们将使用DefaultManagedThreadFactory创建并启动新线程。 从代码中可以看到,一旦我们创建了Thread类的实例,就可以为其设置有意义的名称并将其与优先级相关联。 然后,我们将线程与我们的SimpleTask关联,该SimpleTask在控制台上记录一些数据:

@WebServlet("/FactoryExecutorServlet")public class FactoryExecutorServlet extends HttpServlet {@Resource(name ="DefaultManagedThreadFactory")ManagedThreadFactory factory;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter writer = response.getWriter();Thread thread = factory.newThread(new SimpleTask());thread.setName("My Managed Thread");thread.setPriority(Thread.MAX_PRIORITY);thread.start();writer.write("Thread started. Check logs");}}

现在检查您的服务器日志:毫无疑问,检测自己创建的线程的输出会更容易:

14:44:31,838 INFO [stdout] (My Managed Thread) Simple Task started

在分析线程转储时,收集有关线程名称的信息特别有用,并且线程名称是跟踪线程执行路径的唯一线索。

使用托管执行器服务

java.util.concurrent.ExecutorService接口是一种标准的J2SE机制,已大大取代了使用直接线程执行异步执行的方法。 与标准Thread机制相比,ExecutorService的主要优点之一是您可以定义一个实例池来执行您的作业,并且您可以采用一种更安全的方式来中断您的作业。

在企业应用程序中使用ExecutorService很简单:只需将Managed ThreadFactory的实例传递给ExecutorService的构造函数即可。 在以下示例中,我们使用SingletonEJB在其方法getThreadPoolExecutor中将ExecutorService作为服务提供:

@Singletonpublic class PoolExecutorEJB {private ExecutorService threadPoolExecutor = null;int  corePoolSize  =    5;int  maxPoolSize   =   10;long keepAliveTime = 5000;@Resource(name = "DefaultManagedThreadFactory")ManagedThreadFactory factory;public ExecutorService getThreadPoolExecutor() {return threadPoolExecutor;}@PostConstructpublic void init() {             threadPoolExecutor =  new ThreadPoolExecutor(corePoolSize, maxPoolSize,     keepAliveTime, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(10), factory);      }@PreDestroypublic void releaseResources() {threadPoolExecutor.shutdown();   }}

ThreadPoolExecutor在其构造函数中包含两个核心参数: corePoolSizemaximumPoolSize 。 当在方法中提交新任务且运行的线程数少于corePoolSize时,即使其他工作线程处于空闲状态,也会创建一个新线程来处理请求。 如果运行的线程数大于corePoolSize但小于maximumPoolSize,则仅在队列已满时才创建新线程。

然后,如以下示例所示, ExecutorService用于启动新的异步任务,其中在Servlet中提供了Runnable的匿名实现:

@WebServlet("/FactoryExecutorServiceServlet")
public class FactoryExecutorServiceServlet extends HttpServlet {@EJB PoolExecutorEJB ejb;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {final PrintWriter writer = response.getWriter();writer.write("Invoking ExecutorService. Check Logs.");ExecutorService executorService = ejb.getThreadPoolExecutor();executorService.execute(new Runnable() {public void run() {System.out.println("Message from your Executor!");}});}}

PoolExecutorEJB终止后,ExecutorService也将在Singleton Bean的@PreDestroy方法中完成,该方法将调用ThreadPoolExecutor的shutdown()方法。 ExecutorService不会立即关闭,但将不再接受新任务,并且一旦所有线程都完成了当前任务,ExecutorService就会关闭。

使用动态上下文对象

动态代理是有用的Java调整,可用于使用java.lang.reflect.Proxy API创建接口的动态实现。 您可以将动态代理用于多种不同目的,例如数据库连接和事务管理,用于单元测试的动态模拟对象以及其他类似于AOP的方法拦截目的。

在Java EE环境中,可以使用一种称为动态上下文代理的特殊类型的动态代理

动态上下文对象最有趣的功能是将JNDI命名上下文,类加载器和安全性上下文传播 到代理对象 。 在将J2SE实现引入企业应用程序并希望在容器的上下文中运行它们的情况下,这很有用。

以下代码片段显示了如何将上下文对象注入到容器中。 由于上下文对象还需要您可以向其提交任务的ExecutorService,因此也会注入ThreadFactory:

@Resource(name ="DefaultContextService")ContextService cs;@Resource(name ="DefaultManagedThreadFactory")ManagedThreadFactory factory;

在下一节中,我们将展示如何使用修订版的Singleton EJB创建动态上下文对象。

执行上下文任务

下面的示例演示如何为Callable任务触发上下文代理。 为此,我们将同时需要ManagedThreadfactory和ContextService。 我们的ContextExecutor EJB首先将在其init方法中创建ThreadPoolExecutor。 然后,在Submit方法内,创建可调用任务的新上下文代理,并将其提交给ThreadPool执行器。

这是我们的ContextExecutorEJB的代码:

@Singletonpublic class ContextExecutorEJB {private ExecutorService threadPoolExecutor = null;@Resource(name = "DefaultManagedThreadFactory")ManagedThreadFactory factory;@Resource(name = "DefaultContextService")ContextService cs;public ExecutorService getThreadPoolExecutor() {return threadPoolExecutor;}@PostConstructpublic void init() {threadPoolExecutor = new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS,new ArrayBlockingQueue>Runnable>(10), factory);}public Future>Long> submitJob(Callable>Long> task) {Callable>Long> proxy = cs.createContextualProxy(task, Callable.class);return getThreadPoolExecutor().submit(proxy);}}

CallableTask类比我们的第一个示例复杂一点,因为它将记录有关javax.security.auth.Subject信息,该信息包含在调用方线程中:

public class CallableTask implements Callable<Long> {private int id;public CallableTask(int id) {this.id = id;}public Long call() {long summation = 0;// Do calculationSubject subject = Subject.getSubject(AccessController.getContext());logInfo(subject, summation); // Log Traces Subject identityreturn new Long(summation);}private void logInfo(Subject subject, long summation) { . .  }}

以下是向我们的SingletonEJB提交新的上下文任务的简单方法:

@EJB ContextExecutorEJB ejb;   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {                      CallableTask task = new CallableTask(5);ejb.submitJob(task);}

建立你的例子

为了对Java EE API使用并发实用程序,您的应用程序需要以下Maven依赖项:

<dependency><groupId>org.jboss.spec.javax.enterprise.concurrent</groupId><artifactId>jboss-concurrency-api_1.0_spec</artifactId><version>1.0.0.Final</version></dependency>


http://www.itbuzzpress.com/ 此摘录摘自《 WildFly上的实用Java EE 7开发 》一书,该手册是动手实践指南,其中介绍了最新WildFly应用程序服务器上Java EE 7开发的所有领域。 涵盖了从基础组件(EJB,Servlet,CDI,JPA)到Java Enterprise Edition 7中定义的新技术堆栈的所有内容,因此包括新的Batch API,JSON-P Api,并发API,Web套接字,JMS 2.0 API,核心Web服务堆栈(JAX-WS,JAX-RS)。 带有Arquillian框架和Security API的测试区域完成了本书中讨论的主题列表。

翻译自: https://www.javacodegeeks.com/2014/07/java-ee-concurrency-api-tutorial.html

java ee api

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

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

相关文章

二进制_简学:二进制数制的应用

设现有正整数150&#xff0c;二进制形式为10010110&#xff0c;现有如下题目&#xff0c;求其尽可能简单的解法。题目一&#xff1a;判断该正整数是否是2的乘方&#xff1b;解法&#xff1a;由上表可以看出2的乘方的二进制形式只有一个bit为1&#xff0c;因此判断一个正整数A是…

令人惊讶的注射

所以&#xff0c;我欠吉姆道歉。 他编写了一个有效的模拟和JUnit测试&#xff0c;我在回顾中告诉他&#xff0c;我认为它没有达到他的预期。 当我错了时&#xff0c;这种情况对我来说就像是一个错误 。 称其为理想的意外副作用。 假设您有以下两类&#xff1a; public class S…

swagger 动态设置版本号_如何快速玩转swagger

Spring Boot 框架是目前非常流行的微服务框架&#xff0c;我们很多情况下使用它来提供 Rest API。而对于 Rest API 来说很重要的一部分内容就是文档&#xff0c;Swagger 为我们提供了一套通过代码和注解自动生成文档的方法&#xff0c;这一点对于保证 API 文档的及时性将有很大…

angular java_带有Angular JS的Java EE 7 –第1部分

angular java今天的帖子将向您展示如何使用Java EE 7和Angular JS构建一个非常简单的应用程序。 在去那里之前&#xff0c;让我告诉您一个简短的故事&#xff1a; 我必须承认&#xff0c;我从来都不是Java语言的忠实拥护者&#xff0c;但是我仍然记得我第一次使用它。 我不记得…

操作系统的msxml组件版本过低_Zabbix 5.0 LTS 版本安装

zabbix 5.0 版本于 5 月 11 日正式发布&#xff0c;是最新的 LTS(长期支持)版本&#xff0c;5.0 带来很多功能和特性&#xff0c;后面会陆续推出文章介绍&#xff0c;下面主要介绍下 5.0 版本的安装。环境要求5.0 版本对基础环境的要求有大的变化&#xff0c;最大的就是对 php …

登录判断_Spring Security之多次登录失败后账户锁定功能的实现

在上一次写的文章中&#xff0c;为大家说到了如何动态的从数据库加载用户、角色、权限信息&#xff0c;从而实现登录验证及授权。在实际的开发过程中&#xff0c;我们通常会有这样的一个需求&#xff1a;当用户多次登录失败的时候&#xff0c;我们应该将账户锁定&#xff0c;等…

通过TLS发送的Java邮件

抽象 本博客的目的是演示如何使用Java Mail通过具有TLS连接的SMTP服务器发送电子邮件。 免责声明 这篇文章仅供参考。 在使用所提供的任何信息之前&#xff0c;请认真思考。 从中学到东西&#xff0c;但最终自己做出决定&#xff0c;风险自负。 要求 我使用以下主要技术完成了…

html实体转化字符串 php_php将字符串转为HTML的实体引用的一个类

class HtmlEncode {static $_convertToHtmlEntitiesSrcEncodingUTF-8;/*** 将非ASCII字符串转换成HTML实体** example HtmlEncode::encode("我信了"); //输出:我信了* param string $s 要进行编码的字符串* return string 返回HTML实体引用*/public static function …

arcgis导入excel字段不显示_ArcGIS从excel中导入坐标出现空白无法选择字段

怎样将PDF转成EXCEL怎样将PDF转成EXCEL EXCEL和PDF这两种文档大家应该都比较熟悉&#xff0c;EXCEL表格是使用于数据图表得整理&#xff0c;而PDF文件是用于扫描或者存档&#xff0c;但是这两者之间经常需要进行转换得&#xff0c;比如说经常需要将归档的PDF文件转换成EXCEL表格…

atomic java_在Java中添加@atomic操作

atomic java总览 原子操作如何在Java中工作&#xff0c;OpenJDK / Hotspot中是否存在可以转换为原子的当前替代方法。 反馈 在我以前的文章中&#xff0c; 对可变字段进行原子操作。 有几次指出&#xff0c;不管善意如何&#xff0c;“修复”先前的行为都不太可能继续进行。 …

a4988 脉宽要求_Allegro MicroSystems - A4988: 带转换器和过流保护的 DMOS 微步驱动器

A4988 是一款完全的微步电动机驱动器&#xff0c;带有内置转换器&#xff0c;易于操作。该产品可在全、半、1/4、1/8 及 1/16 步进模式时操作双极步进电动机&#xff0c;输出驱动性能可达 35 V 及 2 A。A4988 包括一个固定关断时间电流稳压器&#xff0c;该稳压器可在慢或混合…

磁盘支持的阵列列表

有时&#xff0c;您的列表可能会变得太大而无法容纳在内存中&#xff0c;因此您必须采取一些措施以避免内存不足。 做到这一点的正确方法是流传输–而不是将所有内容都放入内存中&#xff0c;您应该从源流传输数据并丢弃已经处理的条目。 但是&#xff0c;在某些情况下&#…

apache图片cache容量_apache利用mod_cache缓存图片等

一&#xff0c;引言以前我写过二篇有关图片&#xff0c;静态文件的缓存文章&#xff0c;一个是用varnish来缓存&#xff0c;一个用squid来缓存&#xff0c;apache当然也可以用来做图片&#xff0c;静态文件的缓存&#xff0c;下面我将详细说明一下&#xff0c;怎么完装和配置二…

艾特某人代码实现_Vue@某人,At某人,仿新浪微博@某人,@user,艾特,艾特某人...

atuser.vue展开更多群成员import getCaretCoordinates from textarea-caretexport default {props: {value: { //输入框初始值type: String,default: null},suffix: { //插入字符链接type: String,default: },loop: { //上下箭头循环type: Boolean,default: true},avoidEmail:…

spring batch_Spring Batch作为Wildfly模块

spring batch长期以来&#xff0c;Java EE规范缺少批处理API。 今天&#xff0c;这对于企业应用程序来说是必不可少的。 这是最后固定与JSR-352批处理应用程序的Java平台现在的Java EE提供7 JSR-352得到了它的的灵感Spring Batch的对手。 两者涵盖相同的概念&#xff0c;尽管生…

h3c 链路聚合测试_良无磐石固,虚名复何益?- 链路聚合协议互通测试

一、描述链路聚合是将多条链路聚合在一起形成一个汇聚组&#xff0c;以实现负荷在各成员链路中的分担&#xff0c;同时也提供了更高的连接可靠性。Cisco的链路聚合有几种方式&#xff1a;手工、LACP(包括active和passive两种)、PAgP(Port-aggregation Protocol)&#xff0c;其中…

Spring@懒惰注释

介绍&#xff1a; 默认情况下&#xff0c; Spring框架在应用程序启动时加载并热切初始化所有bean。 在我们的应用程序中&#xff0c;我们可能有一些非常消耗资源的bean。 我们宁愿根据需要加载此类bean。 我们可以使用Spring Lazy批注实现此目的 。 在本教程中&#xff0c;我们…

变压器符号_行输出变压器的结构、符号及电路分析

行输出变压器又称逆程变压器、回扫变压器&#xff0c;俗称行输出&#xff0c;它是电视机、显示器中的一个重要变压器。1.行输出变压器结构行输出变压器的全部绕组和高压整流管均密封在其中&#xff0c;底部引出各个绕组的引脚&#xff0c;高压输出采用高压引线直接送至显像管的…

西南医院微服务咋查得到_#全国最好医院排行榜#发布:成都这4家牛了!四川31个专科排全国前十(总榜)...

病急不能乱投医&#xff01;近日&#xff0c;一年一度、令人期待的——复旦版《2018年度中国医院排行榜&#xff08;总榜&#xff09;》全新揭晓了~这份榜单不仅是是中国医院学科建设的一个标杆也是大众疑难杂症寻找好医院的重要参考四川4家医院入百强&#xff01;华西全国第二…

jit 和 jvm_关于JVM和JIT的一点点

jit 和 jvm如您所知&#xff0c;JVM&#xff08;Java Virtusal Machine&#xff09;使Java能够遵循“一次写入&#xff0c;随处运行”的范例。 JVM的核心包括以下组件&#xff1a; 堆 叠放 PermGen和方法区域 JIT编译器 代码缓存 堆是在应用程序代码开发阶段为您使用的每…