Tag: nonblocking

Java / Scala Future由回调驱动

精简版: 如何创建在回调触发器上完成的Promise ? 长版: 我正在开发一个处理第三方SOAP服务的应用程序。 用户的请求同时委托多个SOAP服务,聚合结果并发送回用户。 系统需要是可扩展的,并且应该允许多个并发用户。 当每个用户请求最终触发大约10个Web服务调用并且每个呼叫阻塞大约1秒时,系统需要设计为具有非阻塞I / O. 我在Play Framework(Java)中使用Apache CXF用于此系统。 我已设法生成异步WS客户端代理并启用异步传输。 我无法弄清楚当我委托多个Web服务代理时如何将Future转换为Play的线程,结果将作为回调获得。 选项1:使用返回Java Future的异步方法调用。 正如java.util.concurrent.Future线程的scala.concurrent.Future包装器中所描述的那样,我们无法将Java Future转换为Scala Future。 从Future获得结果的唯一方法是执行阻止调用者的Future.get() 。 由于CXF生成的代理返回Java Future,因此排除了此选项。 选项2:使用Scala Future。 由于CXF生成代理接口,我不确定是否有任何方式可以干预并返回Scala Future(AFAIK Akka使用Scala Futures)而不是Java Future? 选项3:使用回调方法。 由CXF生成的返回Java Future的异步方法也需要一个回调对象,我想这将在结果准备好时提供回调。 要使用这种方法,我需要返回一个等待我收到回调的Future。 我认为选项3最有希望,虽然我对如何返回一个将在收到回调时完成的Promise没有任何想法。 我可能有一个线程等待一段while(true)并等待,直到结果可用。 再一次,我不知道如何在不阻塞线程的情况下进入wait ? 简而言之,我正在尝试构建一个系统,该系统正在进行大量的SOAP Web服务调用,其中每个调用都会占用大量时间。 在大量并发Web服务调用的情况下,系统可能很容易耗尽线程。 我正在寻找一种基于非阻塞I / O的解决方案,它可以同时允许许多正在进行的Web服务调用。

Jetty和其他容器如何在坚持Servlet规范的同时利用NIO?

我是NIO的新手,我正在试图弄清Jetty如何利用NIO。 我对使用阻塞IO服务请求的传统servlet容器的理解如下: 请求到达 分配一个线程来处理请求,并调用servlet方法( doGet等) Servlet方法是一个InputStream和OutputStream servlet方法从InputStream读取并写入OutputStream InputStream和OutputStream基本上与底层Socket的各个流相关联 使用NIO连接器时有何不同? 我的猜测大致如下: 请求到达 Jetty使用NIO连接器并异步缓冲整个请求 一旦读取了请求,就完全将缓冲区包装在InputStream 创建一个空的响应缓冲区(包装在OutputStream ) 分配一个线程并调用处理上述包装器流的servlet方法( doGet等) Servlet方法写入包装(缓冲)响应流并从servlet方法返回 Jetty使用NIO将响应缓冲区内容写入底层SocketChannel 从Jetty文档中,我发现了以下内容: SelectChannelConnector – 此连接器使用具有非阻塞线程模型的高效NIO缓冲区。 Jetty使用Direct NIO缓冲区,并仅将线程分配给具有请求的连接。 同步模拟对servlet API的阻塞,并且在请求处理结束时任何未刷新的内容都是异步写入的。 我不确定我理解Synchronization simulates blocking for the servlet API意味着什么?

如何从HttpsURLConnection创建Java非阻塞InputStream?

基本上,我有一个URL,可以在发布新消息时从聊天室传输xml更新。 我想将该URL转换为InputStream并继续读取它,只要保持连接并且只要我没有发送Thread.interrupt()。 我遇到的问题是,当从流中读取内容时,BufferedReader.ready()似乎不会成为现实。 我正在使用以下代码: BufferedReader buf = new BufferedReader(new InputStreamReader(ins)); String str = “”; while(Thread.interrupted() != true) { connected = true; debug(“Listening…”); if(buf.ready()) { debug(“Something to be read.”); if ((str = buf.readLine()) != null) { // str is one line of text; readLine() strips the newline character(s) urlContents += String.format(“%s%n”, str); urlContents = filter(urlContents); } […]

在准备好读取的多个套接字中进行选择

我正在编写服务器客户端应用程序。 我有一个服务器,它拥有我从ServerSocket的accept()方法获得的几个套接字。 我想从这些套接字读取,但我不知道哪个套接字可以读取。 我需要某种选择器来选择一个可以读取的套接字,这样我就可以读取它发送的数据了。 谢谢。

Java中的非阻塞文件IO

我想写一个命名管道(已经创建)而不会阻塞读取器。 我的读者是另一个可能会失败的应用程序。 如果读者确实失败了,我希望编写器应用程序继续写入该命名管道。 像Java这样的东西 fopen(fPath, O_NONBLOCK) 因此,当读者出现时,它可能会从失败的地方恢复。