当前位置: 首页 > 知识库问答 >
问题:

Quarkus贾克斯非阻塞误区

通骁
2023-03-14

据我所知:

  • 在quarkus文档中,quarkus正在使用工作线程来执行jaxrsendpoint
  • 这个垂直。在x文档中,工作线程是为调用阻塞代码而设计

可能存在误解:以下术语的确切含义是什么?

  • 服务器非阻塞代码
  • 服务器异步响应处理。
  • 服务器响应代码。

我的问题是:为什么我不能使用jax-rsendpoint创建非阻塞代码并利用标准事件循环线程?

编辑:

有几个问题困扰着我:

默认情况下,restEasy不是异步,但它能够处理非阻塞异步响应

  1. 默认情况下异步,与能够处理非阻塞异步响应之间的区别是什么
  2. 从这里,我发现任何JAX-RS实现都能够处理非阻塞异步响应,因为@Suspended是一个JAX-RS注释,不是吗

我认为这篇文章很好地解释了这些概念的含义。

编辑2:

另一方面,根据QuarkusHttp留档,它说:

应用程序接收的所有HTTP请求都由事件循环(IO线程)处理,然后路由到管理请求的代码。根据目的地的不同,它可以在工作线程(Servlet、Jax-RS)上调用管理请求的代码,或者使用IO线程(反应路由)。

从这里可以看出,默认情况下,所有JAX-RS“endpoint”都由工作线程(worker verticle?)处理因为默认情况下它们是阻塞的。

根据vert。x文件:

默认情况下,阻塞代码在Vert. x工作池上执行。

我现在的问题是:

共有1个答案

步德宇
2023-03-14

JAX-RS只是一个标准。Quarkus使用RESTEasy作为JAX-RS实现。RESTEasy使用阻塞API:

Resteasy在默认情况下不是异步的,但它能够处理非阻塞异步响应,特别是Vert。十、

你可以在这里读到更多:https://github.com/vert-x3/vertx-examples/tree/master/resteasy-examples

RESTEasy是JBoss的一部分。JBoss是Red Hat的一部分。Quarkus也是一个红帽项目。

理论上,您可以使用另一个非阻塞的JAX-RS实现。但是我不知道有什么,原因很简单——JAX-RS已经过时了。

默认情况下,async可能意味着许多不同的事情。在垂直方面。x、 这意味着大多数API要么期望回调,要么返回某种未来(延迟值,如果您愿意的话)。

已经确定,能够处理非阻塞异步响应意味着默认情况下,JAX-RS阻塞直到返回值,但从技术上讲,也可以将其封装为一种延迟值。这就是Vert。x REST易于集成。

@Suspended,或者更具体地说,AsyncResponse,是包装这些值的另一种方法,尽管这种方法比其他方法更为粗糙。

 类似资料:
  • 非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser

  • Web 容器中的非阻塞请求处理有助于提高对改善 Web 容器可扩展性不断增加的需求,增加 Web 容器可同时处理请求的连接数量。servlet 容器的非阻塞 IO 允许开发人员在数据可用时读取数据或在数据可写时写数据。非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 S

  • 问题内容: 我在获取ncurses的getch()阻止时遇到了一些问题。默认操作似乎是非阻塞的(或者我错过了一些初始化)?我希望它可以像Windows中的getch()一样工作。我尝试了各种版本的 (并非同时全部)。如果可能的话,我宁愿不(明确地)使用any 。一个围绕残培环路(),检查特定的返回值是OK了。 问题答案: curses库是一揽子交易。如果不正确初始化库,您不能仅仅提出一个例程并希望

  • 问题内容: 有没有一种方法可以以非阻塞方式使用python的socket.accept()来简单地运行它,并让我检查它是否有任何新连接?我 真的 不想使用线程。谢谢。 问题答案: 您可能想要类似的东西(请参阅文档)。您提供了三个套接字列表:您要监视其可读性,可写性和错误状态的套接字。当新的客户端正在等待时,服务器套接字将是可读的。 该功能将一直阻塞,直到套接字状态之一改变为止。如果您不想永远阻塞,

  • Go提供的网络接口,在用户层是阻塞的,这样最符合人们的编程习惯。在runtime层面,是用epoll/kqueue实现的非阻塞io,为性能提供了保障。 如何实现 底层非阻塞io是如何实现的呢?简单地说,所有文件描述符都被设置成非阻塞的,某个goroutine进行io操作,读或者写文件描述符,如果此刻io还没准备好,则这个goroutine会被放到系统的等待队列中,这个goroutine失去了运行权

  • 问题内容: 我有这段代码可以在Linux中从Serial读取,但是我不知道在读取SerialPort时阻塞和非阻塞之间有什么区别,在哪种情况下哪个更好? 问题答案: 您提到的代码是IMO编码和注释不当的代码。该代码不符合POSIX的可移植性惯例,如正确设置终端模式和POSIX操作系统的串行编程指南中所述。该代码没有提到它使用非规范(也称为原始)模式,并且重用了“阻塞”和“非阻塞”术语来描述 VMI