java ee打印功能_Java EE:异步构造和功能

java ee打印功能

异步

介绍

Java EE具有许多API和构造以支持异步执行。 从可伸缩性和性能的角度来看,这是至关重要的。

让我们假设2个模块相互交互。 当模块A (发送方)以同步方式向模块B (接收方)发送消息时,通信将在单个线程的上下文中进行,即,从模块A发起通信的线程将被阻塞,直到模块B作出响应为止。

这是一个通用的声明,但可以扩展到一个简单的Java方法相互交融的背景下-在这种情况下,从了methodA的methodB 同步调用将在同一个 线程执行这将被阻塞,直到的methodB返回或抛出一个异常。

为什么在基于Java EE的应用程序中需要异步行为?

我们可以进一步将这一点推算到Java EE领域-服务器之间的通信,例如Web层和EJB层(Servlet和EJB)之间的通信,或者是典型的客户端服务器交互-浏览器与RESTful端点,Servlet等的交互-服务器响应客户端请求的线程始终阻塞,直到服务器组件响应。

异步执行在这里发挥作用-如果可以释放/暂停处理客户端请求的服务器线程 ,并且在单独的线程中执行实际的业务逻辑(与原始线程不同),则可以极大地提高性能和可伸缩性。 ! 例如,如果分配给侦听客户端请求的HTTP侦听器线程立即释放,则可以自由地处理来自其他客户端的请求,并且可以在单独的容器线程中执行业务逻辑,然后该容器线程可以通过适当的方法(例如, java.util.concurrent.Future对象或通过客户端注册的回调处理程序 。 从最终用户的角度考虑– 响应非常重要!

深入研究:Java EE中的异步构造和API

让我们看一下Java EE中的一些异步相关功能(API)。 这不是一个详尽的列表,但是应该是一个很好的起点。

不同的Java EE规范具有促进异步功能的典型方式和API。 让我们探索以下Java EE规范

  • JAX-RS 2.0(Java EE 7)
  • Websocket 1.0(Java EE 7)
  • 并发实用工具1.0(Java EE 7)
  • EJB 3.1(Java EE 6)
  • Servlet 3.0(Java EE 6)

注意 :下面提供的代码为摘要形式(出于明显的原因)。 完整样本可在此处访问 。

JAX-RS 2.0

请求的异步处理是JAX-RS 2.0版 (Java EE 7中的新增功能 )的一项新功能 。 为了使用JAX-RS API执行aysnc请求,需要在JAX-RS资源方法本身中注入对javax.ws.rs.container.AsyncResponse接口的引用。 此参数将请求执行置于异步模式,然后该方法继续执行。 业务逻辑执行完成后,需要从单独的线程中调用AsynResponse对象上的resume方法。 可以利用Java EE并发实用程序功能(稍后讨论),例如javax.enterprise.concurrent.ManagedExecutorService ,以将业务逻辑封装为Runnable对象,并将其提交给容器的执行者服务,其余的工作由该服务执行。 无需自己产生不受管理的隔离线程。

@Path("/{id}")@GET@Produces("application/xml")public void asyncMethod(@Suspended AsyncResponse resp, @PathParam("id") String input) {System.out.println("Entered MyAsyncRESTResource/asyncMethod() executing in thread: "+ Thread.currentThread().getName());mes.execute(() -> {System.out.println("Entered Async zone executing in thread: "+ Thread.currentThread().getName());System.out.println("Simulating long running op via Thread sleep() started on "+ new Date().toString());try {Thread.sleep(5000);} catch (InterruptedException ex) {Logger.getLogger(MyAsyncRESTResource.class.getName()).log(Level.SEVERE, null, ex);}System.out.println("Completed Long running op on "+new Date().toString());System.out.println("Exiting Async zone executing in thread: "+ Thread.currentThread().getName());//creating a dummy instance of our model class (Student)Student stud = new Student(input, "Abhishek", "Apr-08-1987");resp.resume(Response.ok(stud).build());});System.out.println("Exit MyAsyncRESTResource/asyncMethod() and returned thread "+Thread.currentThread().getName()+" back to thread pool");}

JAX-RS客户端API也具有异步功能,但本文未对此进行讨论。 他们绝对值得一看!

Websocket 1.0

Websocket API是Java EE工具库(Java EE 7中引入)的全新添加 。 它促进了双向 (服务器和客户端发起的)通信,该通信本质上也是全双工的(客户端或服务器都可以随时向彼此发送消息)。

为了使用Websocket API发送异步消息,需要使用javax.websocket.Session接口上可用的getAsyncRemote方法。 在内部,这不过是javax.websocket.RemoteEnpointjavax.websocket.RemoteEnpoint.Async的嵌套接口的实例。 对此调用常规的sendXXX方法将导致发送过程在单独的线程中执行。 当您考虑交换大消息或处理需要向其发送消息的大量Websocket客户端时,这特别有用。 枯萎的方法返回一个java.util.concurrent.Future对象,或者可以以javax.websocket.SendHandler接口实现的形式注册回调。

public void sendMsg(@Observes Stock stock) {System.out.println("Message receieved by MessageObserver --> "+ stock);System.out.println("peers.size() --> "+ peers.size());peers.stream().forEach((aPeer) -> {//stock.setPrice();aPeer.getAsyncRemote().sendText(stock.toString(), (result) -> {System.out.println("Message Sent? " + result.isOK());System.out.println("Thread : " + Thread.currentThread().getName());});});}

并发实用工具1.0

Java EE并发实用程序是Java EE 7的另一个重要补充 。 它提供了一种标准的生成线程的方式–好的方面是,这些线程是容器管理的而不仅仅是容器没有上下文信息的孤立/孤立线程

通常,Concurrency Utilities 1.0提供了一些用于在单独线程中执行异步任务的标准构造。 它们如下: javax.enterprise.concurrent.ManagedExecutorService javax.enterprise.concurrent.ManagedScheduledExecutorService

为了在单独的线程中启动新任务,可以使用ManagedExecutorService接口提交Runnable 。 除了实现Runnable接口之外,类还可以实现javax.enterprise.concurrent.ManagedTask接口并提供javax.enterprise.concurrent.ManagedTaskListener实现,以侦听通过ManagedExecutorService提交的任务的生命周期更改。

@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("Enter AConcurrencyUtilsExample/doGet executing in thread "+ Thread.currentThread().getName());System.out.println("initiating task . . . ");mes.execute(new AManagedTask());System.out.println("Exit AConcurrencyUtilsExample/doGet and returning thread "+ Thread.currentThread().getName() +" back to pool");}

Servlet 3.0

Servlet 3.0( Java EE 6的一部分)中引入了异步HTTP,它基本上提供了在单独的线程中执行请求并挂起处理客户端调用的原始线程的功能。

这里的关键角色是javax.servlet.AsyncContext接口。 为了启动异步处理,调用java.servlet.ServletRequest接口的startAsync方法。 为了执行核心逻辑,需要将java.lang.Runnable对象提交给AsyncContext接口的start方法。 可以选择通过实现javax.servlet.AsyncListener来附加侦听器,以便在Async任务执行的特定时间接收回调通知。

@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp) {PrintWriter writer = null;try {writer = resp.getWriter();} catch (IOException ex) {Logger.getLogger(MyAsyncServlet.class.getName()).log(Level.SEVERE, null, ex);}//System.out.println("entered doGet()");writer.println("ENTERING ... " + MyAsyncServlet.class.getSimpleName() + "/doGet()");writer.println("Executing in Thread: " + Thread.currentThread().getName());//step 1final AsyncContext asyncContext = req.startAsync();//step 2asyncContext.addListener(new CustomAsyncHandler(asyncContext));//step 3asyncContext.start(() -> {PrintWriter logger = null;try {logger = asyncContext.getResponse().getWriter();} catch (IOException ex) {Logger.getLogger(MyAsyncServlet.class.getName()).log(Level.SEVERE, null, ex);}logger.println("Long running Aync task execution started : " + new Date().toString());logger.println("Executing in Thread: " + Thread.currentThread().getName());try {Thread.sleep(5000);} catch (InterruptedException e) {Logger.getLogger(MyAsyncServlet.class.getName()).log(Level.SEVERE, null, e);}logger.println("Long task execution complete : " + new Date().toString());logger.println("Calling complete() on AsyncContext");//step 4asyncContext.complete();});writer.println("EXITING ... " + MyAsyncServlet.class.getSimpleName() + "/doGet() and returning initial thread back to the thread pool");}

EJB 3.1

通常,(在EJB 3.1之前)EJB消息驱动Bean用于满足与异步相关的要求。 MDB bean侦听发送到javax.jms.Destination队列Topic )的消息,并执行所需的业务逻辑-从发送电子邮件到启动订单处理任务,这可能是任何事情。 要了解的重要一点是,首先将消息发送到Queue的客户端不知道 MDB(已解耦 ),并且不必等待/保持阻塞,直到工作结束(电子邮件收据或订单处理确认) )。

EJB 3.1( Java EE 6的一部分)引入了javax.ejb.Asynchronous批注。 可以将其放在EJB会话bean(无状态,有状态或单例) (使所有方法都异步)上,也可以放在方法级别本身上(以防需要精细控制)。 如果需要跟踪异步方法的结果,则带有@Asynchronous批注的方法可以返回void (失火并忘记)或java.util.concurrent.Future的实例–可以通过调用Future.get()来实现 –需要注意的是, get方法本身实际上是阻塞的。

@Asynchronouspublic Future<String> asyncEJB2(){System.out.println("Entered MyAsyncEJB/asyncEJB2()");System.out.println("MyAsyncEJB/asyncEJB2() Executing in thread: "+ Thread.currentThread().getName());System.out.println("Pretending as if MyAsyncEJB/asyncEJB2() is doing something !");try {Thread.sleep(5000);} catch (InterruptedException ex) {java.util.logging.Logger.getLogger(MyAsyncEJB.class.getName()).log(Level.SEVERE, null, ex);}System.out.println("Exiting MyAsyncEJB/asyncEJB2()");return new AsyncResult("Finished Executing on "+ new Date().toString());}

这是Java EE功能的简短预览。 这些API和规范功能丰富,很难通过博客文章涵盖所有这些API和规范! 我希望这会激起您的兴趣,并为您提供进一步探索的起点。

干杯!

翻译自: https://www.javacodegeeks.com/2014/08/java-ee-asynchronous-constructs-and-capabilities.html

java ee打印功能

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

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

相关文章

驱动备份工具哪个好_大庆seo排名优化推广公司工具哪个好

工具哪个好g81915seo排名优化推广公司大庆,网站成立时&#xff0c;搜索引擎比较完善&#xff0c;基本上不需要长期优化。然而&#xff0c;近年来&#xff0c;搜索引擎优化的频率开始增加&#xff0c;这让人们有点好奇。搜索引擎优化的目的是什么&#xff1f;为什么会受到企业的…

c语言动画原理,动画详解十大经典排序算法(C语言版)

排序算法是程序员必备的基础知识&#xff0c;弄明白它们的原理和实现很有必要。本文中将通过非常细节的动画展示出算法的原理&#xff0c;配合代码更容易理解。概述由于待排序的元素数量不同&#xff0c;使得排序过程中涉及的存储器不同&#xff0c;可将排序方法分为两类&#…

rust如何改睡袋_腐蚀rust怎么做睡袋 | 手游网游页游攻略大全

发布时间&#xff1a;2016-05-07腐蚀是一款FPS僵尸类生存游戏,这款游戏中玩家可以体验到非常自由的游戏方式,玩家需要寻找生存的资源,同时也需要及时预防僵尸和其他不怀还以的玩家的入侵,下面是新手全面攻略分享. 新手全面攻略玩法详解 [Rust游戏介绍] ...标签&#xff1a;游戏…

测量时间:从Java到内核再到

问题陈述 当您深入研究时&#xff0c;即使是最基本的问题也会变得很有趣。 今天&#xff0c;我想深入研究一下Java时间。 我们将从Java API的最基础知识开始&#xff0c;然后逐步降低堆栈&#xff1a;通过OpenJDK源代码glibc一直到Linux内核。 我们将研究各种环境下的性能开销&…

小程序 const moment = require('moment')_C++大作业-XXX管理程序

理工科大一往往会学习C/C&#xff0c;期末会有大作业。这篇文章就是一个简单的C大作业程序。我也是大一&#xff0c;所以觉着哪里写得不好欢迎在评论区提出。程序总体上讲是个“总分总”结构。一 实现这个程序要八步。第一步 程序的功能设计程序的目标有两个。一是辅助我备考四…

c语言osversioninfoex,xi52qian

头文件 一. 对终端的操作相关头文件#include 1. 输入istream2. 输出ostream3. iostream继承istream和ostream 所以它具有输入输出功能。为了方便这个库定义了下列三个标准流对象&#xff1a;1. cin 代表标准输入istream类对象一般地cin使我们能够从用户终端读入数据。2. cout …

go hive skynet_云风的skynet在国内外来看究竟算什么水平?可以一统国内游戏服务端框架吗?...

它和云风过往放出来的东西一样&#xff0c;是非常具有实践性的&#xff0c;可以解决实际开发问题的。目前我所在的手游项目使用 Erlang 进行服务器端开发的&#xff0c;如果重新开始&#xff0c;我会选择使用 skynet。游戏服务器开发中的难点&#xff0c;上面 无瞳已经提到了两…

数据库 测试数据生成_测试数据生成器和对象母亲:另一种外观

数据库 测试数据生成在测试中构造对象通常是一项艰巨的工作&#xff0c;通常会产生大量可重复且难以阅读的代码。 有两种用于处理复杂测试数据的常见解决方案&#xff1a; Object Mother和Test Data Builder 。 两者都有优点和缺点&#xff0c;但是&#xff08;巧妙地&#xff…

电脑机器人_视频|电话积分换平板电脑和扫地机器人?女子拿回家后……-

报警人小王(左二)讲述事情经过。沙坪坝警方供图 华龙网-新重庆客户端 发华龙网-新重庆客户端11月9日11时讯(记者 张勇)“警察叔叔&#xff0c;这个店好坑人哦&#xff0c;我好气愤&#xff01;”11月6日11时许&#xff0c;重庆市沙坪坝区一名年轻女子拨打110报警电话称&#xf…

位置环PID模糊C语言,PID和位置环

EDA365欢迎您登录&#xff01;您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;注册x所谓PID 自动控制&#xff0c;是对一个确定系统的- -个过程量的自动调节过程:* q* }3 B" * V P# H1)举例说&#xff0c;直流电机的速度&#xff0c;就是-一个过程量&#…

seata xid是什么_阿里开源的分布式事务框架 Seata

1. Seata 概述Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写&#xff0c;由 feascar 改名而来。Seata 是阿里开源的分布式事务框架&#xff0c;属于二阶段提交模式。目前github上已经有 12267 颗星了&#xff0c;也很活跃&#xff0c;最新的提交时间…

python输入print跳到documentation-习题 48: 更复杂的用户输入

习题 48: 更复杂的用户输入 你的游戏可能一路跑得很爽&#xff0c;不过你处理用户输入的方式肯定让你不胜其烦了。每一个房间都需要一套自己的语句&#xff0c;而且只有用户完全输入正确后才能执行。你需要一个设备&#xff0c;它可以允许用户以各种方式输入语汇。例如下面的机…

有关有效企业测试的视频课程

我已经制作了一些有关有效企业测试的视频。 我仍然在现实世界项目中看到这个主题的巨大重要性。 这是我在测试Enterprise Java项目中的经验以及一些示例。 1.介绍和有效的Maven使用 在此视频中&#xff0c;我将介绍测试过程&#xff0c;并演示如何使用Maven在标准企业项目中构…

android自定义弹出对话框,使用FlyDialog实现自定义Android弹窗对话框

前言学习的时候要用到弹窗&#xff0c;但是又觉得i同自带的弹窗样式有点不太美观&#xff0c;搜索资料后发现了FlycoDialog这个开源库,效果很好&#xff0c;而且实现起来也比较方便。先列举一些比较好看的效果:NormalListDialogActionSheetDialog这篇文章主要来讲一下他的自定义…

nacos 本地测试_Nacos集群配置实例(windows下测试)

1、首先 fork 一份 nacos 的代码到自己的 github 库&#xff0c;然后把代码 clone 到本地。git地址&#xff1a;https://github.com/alibaba/nacos.git2、然后将你的项目导入到ideal编辑器中(找到子项目distribution)3、添加集群节点&#xff1a;找到文件distribution->conf…

Android手机如何修改Mac地址,安卓手机怎么修改mac地址

有些时候我们如果绑定了某个mac&#xff0c;那么其他用mac就无法上网&#xff0c;应该怎么修改呢?学习啦小编从网上搜集整理了3种修改安卓手机mac 地址的方法。修改安卓手机mac 地址的方法修改安卓手机mac 地址的方法第一种&#xff1a;软件法下面介绍一款软件 叫物理地址修改…

应用回归分析何晓群_二战上岸人大20年应用统计高分经验帖

首先介绍一下本人的基本情况。男&#xff0c;本科金融学&#xff0c;同时修过数学双学位。一战人大经济学硕&#xff0c;总分 370&#xff08;专业课没过线&#xff09;。二战决定考人大应统专硕&#xff08;除了专业课换了&#xff0c;公共课都一样&#xff09;。二战总分430&…

基于单片机步进电机ppt答辩_基于单片机的步进电机式汽车仪表的设计(含电路原理图,程序)...

基于单片机的步进电机式汽车仪表的设计(含电路原理图,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文21000字,程序,答辩PPT)摘 要汽车仪表是驾驶者和汽车的交互界面&#xff0c;为驾驶员提供所需要的运行参数、故障、里程等实时信息&#xff0c;是不可或缺的部分。…

android webview js 交互框架,自定义android混合框架开发实践1:实现基础andorid和webview交互...

1. 本地web资源1.构建assets/web文件夹2.创建index.html你的html代码3.使用本地web资源WebView mv findViewById(...);mv.loadUrl("file:///android_asset/web/index.html")2.实现基础的android和js交互(1). 实现js调用andorid方法在Acitivity内构建一个functionJav…

jxls使用excel公司_使用jXLS将Excel文件解析为JavaBeans

jxls使用excel公司这篇文章展示了如何使用jXLS将Excel文件解析为JavaBeans列表。 这是我编写的通用实用程序方法&#xff1a; /** * Parses an excel file into a list of beans. * * param <T> the type of the bean * param xlsFile the excel data file to parse * …