晚安,我执行文件上传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
答案 0 :(得分:2)
您应该使用java.util.concurrent.atomic.AtomicInteger
来确保线程正确。
private AtomicInteger counter;
...
System.out.println ("COUNTER EX:" + counter.incrementAndGet());
这也可能是另一个线程安全问题的症状 - p:fileUpload multiple
违反了JSF的并发要求,并可能触发意外行为(例如,构造多个BeanUpload
实例)。请参阅this answer。