Servlet 3.1 - 多部件异步处理

5
我正在测试Servlet 3.1 API以处理多部分请求。我希望同步处理一些部分(文本字段),异步处理其他部分(文件字段)。乍一看,似乎在Servlet 3.1中无法实现这一点(无论是在异步上下文中通过request.getInputStream()完全异步还是类似于apache-commons-fileupload库的多部分处理)。
是否有一种方法可以使用Servlet 3.1进行同步/异步处理?
提前感谢您的时间! :)

创建一个ExecutorService并提交独立的任务。 - Sotirios Delimanolis
4个回答

7
Synchronoss Technologies最近开源了一个非阻塞HTTP多部分解析器,可与Servlet 3.1一起使用。您只需编写Servlet 3.1的ReadListener,将传入的字节传递给NioMultipartParser即可。解析器将为接收到的每个部分向您的代码进行回调。免责声明:我在Synchronoss Technologies工作。我们开源了这个库,因为它实现起来非常麻烦!Servlet 3.1提供的功能似乎存在一些缺陷,希望其他人也能发现这个库有用。请点击此处获取更多信息。

太棒了!感谢你开源它!!!我一有机会就会尝试使用它!;) - Francisco Carriedo Scher

3
我一直在寻找类似的例子,但惊讶地发现自从原问题发布以来已经过去了一年,竟然没有太多相关内容。
无论如何,我本来要写自己的代码,但是我的理智告诉我去谷歌搜索。Grizzly项目在这里编写了一个异步多部分示例:https://grizzly.java.net/httpserverframeworkextras.html 虽然无法直接插入到Servlet 3.1 readListener中,但我认为应该很容易适应(这是我的下一个任务)。

你有时间将Grizzly的MultipartScanner实现移植到Servlet 3.1 ReadListener吗? - Marc-Christian Schulze
是的,它还没有完成,但我希望在准备好时将其发布到GitHub上。 - Jarym
我最近发现了https://github.com/Elopteryx/upload-parser。这是你的吗? - Marc-Christian Schulze
那是我的库。如果您有任何问题,我很乐意帮助。 - Elopteryx

0

无法在同步/异步之间切换,常见的库/API都不支持。

Servlet API在3.0版本中添加了上传处理支持,但完全是阻塞的。

Commons Fileupload库具有流式API,您可以以阻塞或异步方式调用它,但然后您必须自己实现。

您还可以使用this库,该库可以配置为工作在阻塞模式或异步模式(通过实现ReadListener接口)。如果您知道某些请求仅包含文本字段或小文件,则可以基于此进行配置。


0
如果您可以确保所有文本字段首先出现,那么您应该能够同步地首先读取这些字段,然后是文件字段,异步地读取它们。
否则,只能通过同步或异步地将整个请求读入内存,然后直接处理文本字段并将文件字段提交给某个线程池来实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接