Tag: 异步

快速NIO,Java异步HTTP服务器

关于这个问题,我实际上正处于为我的一个项目找到合适的HTTP容器的阶段。 我查看了几个容器,但我仍然不确定哪一个最适合高负载AJAX请求。 Apache Mina看起来非常有前景,但也相对复杂。 名为AsyncWeb的异步Web服务器实现似乎已与Mina合并,但我找不到它的任何生产相关性。 在另一个问题中,我推荐了我非常喜欢的简单HTTP服务器,因为它简单,清晰,干净,但我仍然不知道它是否符合目的。 另外,我不确定选择哪个请求处理概念: 为每个传入连接创建一个调度程序线程(优化当然可能包括一个线程池和一个调度队列),即完成所有工作。 优点可能是,我不必处理那么多同步问题,但它可能会大大降低高负载的吞吐量。 因为它将是一个高度模块化的应用程序“流水线”(我猜可能有一个更合适的术语;)方法也可以起作用:创建固定数量的线程,每个线程用于某个任务。 例如,一个用于请求处理 – >一个用于头部反序列化(如果我以不同的格式输入,如提交的HTML表单,XML-RPC,JSON等) – >一个用于“控制器调度”(做我想对这些数据做的任何事情) ) – >和一个用于以所需格式(JSON,XML,HTML等)序列化输出,并将每个请求移动到这些级别,直到完成为止。 可能更难以实现,但我有固定数量的线程(数量也可以依赖于硬件)和关注点的清晰分离。 任何可能适合的框架的经验和两种不同的处理方法?

@Async阻止线程继续,直到其他线程完成

我有一个应用程序,其中需要计算一定数量的东西。 此计算函数具有注释@Async(来自Spring Framework),这使得可以在4个线程上运行这些计算。 问题是我需要大约40000个这样的计算,我想知道所有计算的开始和结束之间的时间,所以我看看在调用计算函数的for循环之前和之后的时间。 但是现在所有的计算都被放入队列中,因此for循环立即结束,时间就像1秒钟,而计算完成需要几个小时。 我已经尝试将最大队列大小设置为大约100(也很好地减少了内存使用量),但这也没有解决方案,因为我将错过它花费的总时间中的最后100次计算。 有没有办法在for循环之后暂停执行代码,直到所有线程完成其工作,但仍然能够使用@Async注释? 这是一些说明相同问题的代码: 执行课程: public class Foo { public void executeBlaALotOfTimes() { long before = System.currentTimeMillis(); for (int i = 0; i<40000; i++) { executeBla(); } long after = System.currentTimeMillis(); System.out.println("Time it took for a lot of bla to execute: " + (after – before) / 1000.0 + " seconds."); […]

异步JAX-RS的目的是什么

我正在阅读“使用JAX-RS 2.0的RESTful Java”一书。 我完全混淆了异步JAX-RS,因此我将所有问题都集中在一起。 这本书写的异步服务器如下: @Path(“/customers”) public class CustomerResource { @GET @Path(“{id}”) @Produces(MediaType.APPLICATION_XML) public void getCustomer(@Suspended final AsyncResponse asyncResponse, @Context final Request request, @PathParam(value = “id”) final int id) { new Thread() { @Override public void run() { asyncResponse.resume(Response.ok(new Customer(id)).build()); } }.start(); } } Netbeans创建这样的异步服务器: @Path(“/customers”) public class CustomerResource { private final ExecutorService executorService = […]

用于处理Java中的异步响应的设计模式

我从类似的问答中读到答案 如何在JAVA中创建异步HTTP请求? | 异步编程设计模式 | AsyncTask Android – 设计模式和返回值 我看到很多解决方案,但没有一个真的让我满意。 听众的方式 捕获结果后,处理将在onResult方法中实现。 public interface GeolocationListener { public void onResult(Address[] addresses); public void onError(Exception e); } 这个解决方案并不能让我满意,因为我想在main方法中处理结果。 我讨厌这个接口,因为当返回响应时,它会在onResult中处理,导致处理链,无法返回“main”方法。 servlet的方式 public class SignGuestbookServlet extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { // … resp.sendRedirect(“/guestbook.jsp”); } } 没有公开的Java代码调用servlet。 所有配置都在web.xml中完成 我想要的方式 等待这样的回复 Response a = […]

如何通知Jetty 9.02的“内容消耗”。 ContentListener?

我有一个Jetty HttpClient使用Jetty v9.0.2发送异步请求。 我有一个成功缓冲响应的Response.ContentListener和一个在调用完成时调用的Response.CompeleteListener。 Jetty 9.2 JavaDocs有一个Request.AsyncContentListener ,它有一个参数告诉Jetty已经消耗了内容: callback – 内容消耗时调用的回调。 此侦听器类型不在Jetty v9.0.2响应API中: import org.eclipse.jetty.client.api。 结果 ; 真的有两个问题: Response.ContentListener是否需要通知Jetty客户端内容已被使用? 如果是这样:如何使用Jetty v9.0.2进行管理 使用这两个Response.ContentListener和Response.CompeleteListener设置的异步调用需要什么样的清理? 是否有使用Jetty v9.0.2异步的潜在gottchas? 它似乎工作正常; 我需要确保我们没有资源泄漏或潜在的泄漏等。当然,我们需要程序很好,干净,所以它可以24×7全天候运行。 在此先感谢您的欢迎帮助。 注意: Request.AsyncContentListener – Stable Jetty doc (jetty 9.2,我相信)

Java:使用异步编程优化应用程序

我必须修改dropwizard应用程序以改善其运行时间。 基本上,该应用程序每天接收大约300万个URL,并下载并解析它们以检测恶意内容。 问题是该应用程序只能处理100万个URL。 当我查看应用程序时,我发现它正在进行大量的顺序调用。 我想要一些关于如何通过使其成为异步或其他技术来改进应用程序的建议。 所需代码如下: – /* Scheduler */ private long triggerDetection(String startDate, String endDate) { for (UrlRequest request : urlRequests) { if (!validateRequests.isWhitelisted(request)) { ContentDetectionClient.detectContent(request); } } } /* Client */ public void detectContent(UrlRequest urlRequest){ Client client = new Client(); URI uri = buildUrl(); /* It returns the URL of this dropwizard application’s […]

Java:异步数据库写入的TaskExecutor?

我正在考虑使用Java的TaskExecutor来启动异步数据库写入。 可以理解的是,线程并不是免费的,但假设我使用的固定线程池大小为5-10,这怎么是一个坏主意? 我们的应用程序使用缓冲区从一个非常大的文件读取,并在执行一些数据操作后将此信息刷新到数据库。 在这里使用异步写入似乎是理想的,这样我们就可以继续处理该文件了。 我错过了什么? 为什么每个应用程序都不使用异步写入?

ImageIO write()是一种阻塞方法吗?

在我正在使用java开发的应用程序中,我使用ImageIO API来缩放图像,然后将它们写入目录,然后通知Web服务器图像已准备好使用。 在向Web服务器发送信号之前的最后一个调用是ImageIO.write()方法,但Web服务器此时无法找到生成的图像。 (Web服务器能够看到它们后几毫秒。)。 我怀疑是ImageIO.write()是异步运行的。 我搜索了很多,但我无法找到ImageIO.write()是同步还是异步操作。 如果ImageIO.write()没有阻止程序流,是否有一种非黑客方式让它等到映像写入目标目录?

Hibernate 4.1.9(最新的最终版本)报告`不支持嵌套事务`

我得到了一个 org.hibernate.TransactionException: nested transactions not supported at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:152) at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1395) at com.mcruiseon.server.hibernate.ReadOnlyOperations.flush(ReadOnlyOperations.java:118) 抛出该exception的代码。 我从一个运行无限的线程调用flush,直到有数据要刷新。 public void flush(Object dataStore) throws DidNotSaveRequestSomeRandomError { Transaction txD; Session session; session = currentSession(); // Below Line 118 txD = session.beginTransaction(); txD.begin() ; session.saveOrUpdate(dataStore); try { txD.commit(); while(!txD.wasCommitted()) ; } catch (ConstraintViolationException e) { txD.rollback() ; throw new DidNotSaveRequestSomeRandomError(dataStore, feedbackManager); } […]

validationCXF HttpAsyncClient使用use.async.http.conduit上下文属性

我正在尝试使用CXF异步HTTP客户端传输,通过设置“use.async.http.conduit”属性, 如此线程中所详述,并由此CXF文章推荐。 我使用以下代码执行此操作: Client client = ClientProxy.getClient(wsClient); client.getRequestContext().put(“use.async.http.conduit”, Boolean.TRUE); 碰巧,我的Web服务调用超时(可能是由于某些环境网络问题),我的客户端exception包含(提取): java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) at java.io.BufferedInputStream.read(BufferedInputStream.java:317) at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:698) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:641) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1218) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379) at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:260) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1513) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1486) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1305) at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:623) 上面的exception堆栈表明java.net.HttpURLConnection类仍在使用,并且基于CXF文档,该设置尚未生效。 我想弄清楚的是如何确保“use.async.http.conduit”生效,即是否存在可以测试的特定行为,或者我可以在客户端上启用的特定日志配置毫无疑问会告诉我Apache HttpAsyncClient正在使用中吗? 非常感谢 :)