使用计数器执行fileupload Primefaces multiple

时间:2015-04-16 01:53:13

标签: jsf file-upload primefaces

晚安,我执行文件上传Primefaces并不安全。

上传执行正常,但我想有一个控制

的计数器

收到的文件。问题是通过这种方法发送文件的速度非常快

似乎并行运行。我的问题是发送文件时这种行为是否正常。

如果不是,可能是错误。如果这是正常的我该怎么做才能使计数器真正采取正确的价值?

我正在使用“bean”类型的视图范围,但是当我试图运行会话时,问题也会发生,具体取决于文件大小。

如果我的文件非常小,执行速度非常快,我无法关注计数器。

如果我清理代码,无论文件大小如何,执行通常都会发生。

@ManagedBean (Name = "bean") 
@ViewScoped 
public class BeanUpload { 

private int counter;

@PostConstruct 
public void init () { 
    counter = 0; 
} 
public void fileUploadAction (FileUploadEvent event) {
    counter = counter + 1; 
    System.out.println ("COUNTER EX:" + counter); 
}

}

XHTML:

<h:form prependId="false" id="form1" name="form1" enctype="multipart/form-data">
<p:outputPanel id="divUpload" style="padding-bottom: 8px;">
    <p:fileUpload id="upload"  
        mode="advanced"  fileUploadListener="#{bean.fileUploadAction}"
        multiple="true"  sizeLimit="10485760" cancelLabel="Cancelar" fileLimit="4" allowTypes="/(\.|\/)(gif|jpe?g|png|pdf|odt|doc|docx|xls|xlsx|cvs|txt|xml)$/" >
     </p:fileUpload>        
</p:outputPanel>

控制台上3个文件的结果是:

COUNTER EX: 1 
COUNTER EX: 1 
COUNTER EX: 1 

如果我在控制台上以调试模式运行代码,结果就是:

COUNTER EX: 1 
COUNTER EX: 2 
COUNTER EX: 3 

1 个答案:

答案 0 :(得分:2)

您应该使用java.util.concurrent.atomic.AtomicInteger来确保线程正确。

private AtomicInteger counter;
...
System.out.println ("COUNTER EX:" + counter.incrementAndGet()); 

这也可能是另一个线程安全问题的症状 - p:fileUpload multiple违反了JSF的并发要求,并可能触发意外行为(例如,构造多个BeanUpload实例)。请参阅this answer