gpt4 book ai didi

jsf - Primefaces 5.1 中多个文件上传失败

转载 作者:行者123 更新时间:2023-12-02 15:06:26 25 4
gpt4 key购买 nike

我尝试使用 PF 5.1 和 OmniFaces 1.7 版在 primefaces 中上传文件。

我的.xhtml代码:

<h:form id="fileImportForm" styleClass="prepend-top"
prependId="false">

<div style='margin-bottom:10px'>
<h:outputLabel value="#{msg.file_import_msg}"/>
</div>
<p:fileUpload id="fileImport" fileUploadListener="#{fileImport.handleFileUpload}"
mode="advanced"
update="messages"
multiple="true"
label="#{msg.file_import_choose_label}"
uploadLabel="#{msg.file_import_upload_label}"
cancelLabel="#{msg.file_import_cancel_label}"
/>
<p:growl id="messages" showDetail="true"/>

</h:form>

我的支持 bean:

package test.boundary;

import javax.inject.Named;
import org.primefaces.event.FileUploadEvent;
import com.haslerrail.aura.common.exception.SystemException;

/**
* BackingBean for <code>fileImport.xhtml</code> page.
*
*/
@Named
public class FileImport implements java.io.Serializable {

private static final long serialVersionUID = 1L;

public void handleFileUpload(final FileUploadEvent event) throws SystemException, InterruptedException {

if (event == null || event.getFile() == null || event.getFile().getSize() == 0) {
System.out.println("No file");

}
System.out.println(event.getFile().getFileName());
Thread.sleep(500); // wait a little to force the exception!
}
}

问题是,当我的handleFileUpload函数需要更长的时间来解析上传的文件(Thread.sleep(500))时,它会抛出异常!只有当我同时上传多个文件时才会发生该异常时间。

异常(exception):

09:47:33,171 WARN  [org.jboss.weld.Conversation] WELD-000315 Failed to acquire conversation lock in 1,000 for Conversation with id: 1
09:47:33,180 SEVERE [org.omnifaces.exceptionhandler.FullAjaxExceptionHandler] FullAjaxExceptionHandler: An exception occurred during processing JSF ajax request. Error page '/pages/error/error.xhtml' will be shown.: org.jboss.weld.context.BusyConversationException: WELD-000322 Conversation lock timed out: 1
at org.jboss.weld.context.AbstractConversationContext.activate(AbstractConversationContext.java:215) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
at org.jboss.weld.jsf.WeldPhaseListener.activateConversations(WeldPhaseListener.java:108) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
at org.jboss.weld.jsf.WeldPhaseListener.beforePhase(WeldPhaseListener.java:85) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:102) [primefaces-5.1.jar:5.1]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.omnifaces.filter.CacheControlFilter.doFilter(CacheControlFilter.java:226) [omnifaces-1.7.jar:1.7]
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:77) [omnifaces-1.7.jar:1.7]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:489) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_75]

对我来说,这看起来像是 PF 5.1 中的错误!还有其他想法吗?

最佳答案

p:fileUpload multiple="true" 在其自己的请求中上传每个文件。问题是,请求同时发生,在您的情况下会触发 session 锁定超时,因为每个请求都尝试访问相同的 session 。另一个问题是,JSF 实际上需要客户端代码顺序发送请求,而其服务器端代码不是线程安全的。

我建议让上传请求按顺序发生。有多种方法可以实现这一目标。

  1. PrimeFaces 5.2.6 及更高版本:您应该能够仅使用 sequential 属性:

    <p:fileUpload sequential="true" ...

    (该属性已在 PF Issue #403 中实现。)

  2. This answer建议通过 Javascript 来配置 PrimeFaces 使用的 jQuery 文件上传插件。

  3. 添加 Weld 依赖项。然后,您可以更改默认的锁定超时(以不可移植的 CDI 方式),以便请求在服务器上形成队列。默认锁定超时为 1 秒。以下代码全局更改所有对话的锁定超时。

    import javax.enterprise.context.ConversationScoped;
    import javax.enterprise.context.Initialized;
    import javax.enterprise.event.Observes;
    import javax.inject.Inject;
    import javax.servlet.ServletRequest;
    import org.jboss.weld.context.http.HttpConversationContext;

    public class ConversationTimeoutDefaultSetter {

    @Inject
    private HttpConversationContext ctx;

    public void conversationInitialized(
    @Observes @Initialized(ConversationScoped.class)
    ServletRequest payload) {
    ctx.setConcurrentAccessTimeout(10000L); // 10 seconds
    }

    }

更新:我忘记了,Initialized 需要 CDI 1.1,而您似乎正在使用 1.0。您可以在开始对话时设置超时。

关于jsf - Primefaces 5.1 中多个文件上传失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30500731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com