java - 在后台线程中获取 MultipartFormDataInput 的主体
问题描述
我有一个可能很大的文件要解析,作为MultipartFormDataInput
. 由于解析可能需要很长时间,我想在后台线程中进行:
@Resource
private ManagedExecutorService executorService;
@POST
@Path("file")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void upload(MultipartFormDataInput input) {
executorService.execute(() -> {
for (InputPart inputPart : input.getFormDataMap().get("file")) {
try {
InputStream inputStream = inputPart.getBody(InputStream.class, null);
CSVReader csvReader = new CSVReader(new InputStreamReader(inputStream, "UTF-8"));
// further processing
} catch (Exception e) {
logger.error("Something went wrong", e);
}
}
});
}
不幸的是,getBody
抛出以下错误:
org.jboss.resteasy.spi.LoggableFailure:RESTEASY003880:找不到类型的上下文数据:javax.ws.rs.ext.Providers
我有机会在不同的线程中提取身体吗?
下面的完整堆栈跟踪:
16:33:30,634 ERROR [MyService] (EE-ManagedExecutorService-default-Thread-4) Something went wrong: org.jboss.resteasy.spi.LoggableFailure: RESTEASY003880: Unable to find contextual data of type: javax.ws.rs.ext.Providers
at org.jboss.resteasy.core.ContextParameterInjector$GenericDelegatingProxy.invoke(ContextParameterInjector.java:75)
at com.sun.proxy.$Proxy112.getMessageBodyReader(Unknown Source)
at org.jboss.resteasy.plugins.providers.multipart.MultipartInputImpl$PartImpl.getBody(MultipartInputImpl.java:335)
at MyService.lambda$upload$0(MyService.java:189)
at org.jboss.as.ee.concurrent.ControlPointUtils$ControlledRunnable.run(ControlPointUtils.java:105)
at org.wildfly.security.auth.server.SecurityIdentity.runAsConsumer(SecurityIdentity.java:335)
at org.wildfly.security.auth.server.Scoped.runAsConsumer(Scoped.java:101)
at org.wildfly.security.auth.server.Scoped.runAs(Scoped.java:49)
at org.jboss.as.ee.concurrent.SecurityIdentityUtils.lambda$doIdentityWrap$1(SecurityIdentityUtils.java:63)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)
at org.jboss.as.ee.concurrent.service.ElytronManagedThreadFactory$ElytronManagedThread.lambda$run$0(ElytronManagedThreadFactory.java:76)
at org.wildfly.security.auth.server.SecurityIdentity.runAsConsumer(SecurityIdentity.java:335)
at org.wildfly.security.auth.server.Scoped.runAsConsumer(Scoped.java:101)
at org.wildfly.security.auth.server.Scoped.runAs(Scoped.java:49)
at org.jboss.as.ee.concurrent.service.ElytronManagedThreadFactory$ElytronManagedThread.run(ElytronManagedThreadFactory.java:76)
解决方案
推荐阅读
- python - GCP AI 平台 API,拒绝访问
- ios - 为什么SKScene的view属性在呈现场景时没有设置?
- python - 设置scrapyd输出文件的格式
- rust - Rust 中是否有任何机制等效于没有虚拟(动态调度)的 C++ 继承?
- vue.js - 如何在具有多个过滤器的 v-data-table 中选择默认值
- node.js - 在使用 Angular 应用程序运行 Lighthouse 后注册一个卸载侦听器
- reactjs - 如何在使用反应选择后过滤值重置 - 管理员
- c++ - std::partition 实现
- python - Python OS For Loop - TypeError:“模块”对象不可调用
- c++ - C ++中的GFG括号检查器问题给出错误答案