当前位置: 首页 > news >正文

免费大数据网站网络服务业有哪些

免费大数据网站,网络服务业有哪些,免费服务器主机,华为建站模板java ee api这是一个示例章节#xff0c;摘自Francesco Marchioni编辑的WildFly上的实用Java EE 7开发 。 本章讨论了新的Java EE并发API#xff08;JSR 236#xff09; #xff0c;它概述了使用一组托管资源在Java EE容器上并行执行任务的标准方法。 为了描述如何在您的应… java ee api 这是一个示例章节摘自Francesco Marchioni编辑的WildFly上的实用Java EE 7开发 。 本章讨论了新的Java EE并发APIJSR 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并发APIJSR 236您可以将java.util.concurrent API的扩展用作托管资源 即由Container进行管理。 与标准J2SE编程的唯一区别是您将从容器的JNDI树中检索托管资源。 但是您仍将使用属于java.util.concurrent包的一部分的Runnable接口或类例如Future或ScheduledFuture 。 在下一节中我们将从最简单的示例开始该示例使用ManagedExecutorService执行异步任务。 使用ManagedExecutorService提交任务 为了创建我们的第一个异步执行我们将展示如何使用ManagedExecutorService 它扩展了Java SE ExecutorService以提供用于提交要在Java EE环境中执行的任务的方法。 通过使用此托管服务容器的上下文将传播到执行任务的线程ManagedExecutorService包含在应用程序服务器的EE配置中 subsystem xmlnsurn:jboss:domain:ee:2.0. . .concurrent. . . .managed-executor-servicesmanaged-executor-service namedefaultjndi-namejava:jboss/ee/concurrency/executor/defaultcontext-servicedefault hung-task-threshold60000core-threads5 max-threads25 keepalive-time5000//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();FutureLong 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 CallableLong {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它实现了taskSubmitting taskStarting taskDone和taskAborted方法 public class CallableListenerTask implements CallableLong,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事务APIJTA通过javax.transaction.UserTransaction来支持其组件顶部的事务该操作用于显式划分事务边界。 以下代码显示可调用任务如何从JNDI树中检索UserTransaction然后启动并提交与外部组件EJB的事务 public class TxCallableTask implements CallableLong {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的结果 ScheduledFutureLong 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 ArrayBlockingQueueRunnable(10), factory); }PreDestroypublic void releaseResources() {threadPoolExecutor.shutdown(); }} ThreadPoolExecutor在其构造函数中包含两个核心参数 corePoolSize和maximumPoolSize 。 当在方法中提交新任务且运行的线程数少于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 ArrayBlockingQueueRunnable(10), factory);}public FutureLong submitJob(CallableLong task) {CallableLong proxy cs.createContextualProxy(task, Callable.class);return getThreadPoolExecutor().submit(proxy);}} CallableTask类比我们的第一个示例复杂一点因为它将记录有关javax.security.auth.Subject信息该信息包含在调用方线程中 public class CallableTask implements CallableLong {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依赖项 dependencygroupIdorg.jboss.spec.javax.enterprise.concurrent/groupIdartifactIdjboss-concurrency-api_1.0_spec/artifactIdversion1.0.0.Final/version/dependency 此摘录摘自《 WildFly上的实用Java EE 7开发 》一书该手册是动手实践指南其中介绍了最新WildFly应用程序服务器上Java EE 7开发的所有领域。 涵盖了从基础组件EJBServletCDIJPA到Java Enterprise Edition 7中定义的新技术堆栈的所有内容因此包括新的Batch APIJSON-P Api并发APIWeb套接字JMS 2.0 API核心Web服务堆栈JAX-WSJAX-RS。 带有Arquillian框架和Security API的测试区域完成了本书中讨论的主题列表。 翻译自: https://www.javacodegeeks.com/2014/07/java-ee-concurrency-api-tutorial.htmljava ee api
http://www.pierceye.com/news/886906/

相关文章:

  • 什么店是做网站制作的dw网站结构图怎么做
  • 一个网站开发需要多久软件开发工时费用标准
  • 做网站 公司不懂英文怎么做英文的seo网站
  • 南宁企业门户网站建设价格连云港网站建设电话
  • 石林彝族网站建设网站活动页面设计
  • 网站建设流程表推广联盟有哪些平台
  • 制作网站深圳建大型门户网站
  • 网站开发招标技术规范书网站建设动态静态
  • 阿里巴巴网站开发工具北京的网站制作公司
  • 石家庄网站营销互联网运营培训课程
  • 单位网站服务的建设及维护oa软件定制开发
  • 银川公司网站建设zepto网站开发
  • 看谁做的好舞蹈视频网站电话营销
  • 开封建网站到哪里学平面设计
  • 电子商务与网站建设实践论文化工行业网站建设
  • 如何搭建一个网站平台卖16斤肉赚200元
  • 手机主页网站推荐江宁城乡建设局网站
  • 甜品网站设计论文张家界seo
  • 单位网站及政务新媒体建设管理wordpress刷留言
  • 用花瓣网站上的图片做游戏行吗西安霸屏推广
  • 单片机和做网站医疗网站建设渠道
  • 上海做家纺的公司网站新闻发布稿
  • 广告网站大全扁平化网站psd
  • wordpress开启多站点那个网站可以做宣传
  • 专门建站的公司本网站正在建设升级中
  • 花市小说网站那里进建网站的公司哪里有
  • 自建网站服务器备案免费做易拉宝网站
  • 经典手机网站家政公司网站模板
  • 外贸做的亚马逊网站是哪个好产品怎样推广有效
  • 网站后台数据库备份怎么做怎样在阿里做网站