我正在构建一个允许用户管理任务的应用程序。任务监控屏幕可由两个用户同时访问。每个用户都可以查看任务当前是否正在运行,并且可以停止或启动它。每当一个用户启动/停止任务时,另一用户必须在自己的屏幕上看到任务状态的变化。
但是,我构建的代码不起作用。当用户启动任务时,其他用户的屏幕会尝试立即停止该任务。然后某种“ war ”开始:第一个用户的屏幕重新激活任务,第二个用户的屏幕重新停止任务,依此类推。
我怎样才能避免这场 war ?
这是我的代码:
taskMonitoring.xhtml
<p:poll
interval="5"
process="sbbActivateTask" />
<h:outputLabel
value="Activate task:" />
<p:selectBooleanButton
id="sbbActivateTask"
value="#{taskBean.state}"
onLabel="YES"
offLabel="NO"
valueChangeListener="#{taskBean.switchTask}"/>
TaskBean.java
@ManagedBean(name = "taskBean")
@ViewScoped
public class TaskBean {
public void setState(boolean b) {
// I deliberately put nothing here ...
}
public boolean getState() {
return TaskManager.getState();
}
public void switchTask() {
TaskManager.switchTask();
}
}
最佳答案
我猜当民意调查触发并更新 <selectBooleanButton>
时,它看到变化并触发 valueChangeListener
,将其切换回来,从而出现竞争条件。我不想在同一个控件中混合状态和命令。
我的建议:与 showcase of the component 相同的代码。即:
<p:selectBooleanButton
id="sbbActivateTask"
value="#{taskBean.state}"
onLabel="YES"
offLabel="NO"
>
<p:ajax listener="#{taskBean.switchTask}"/>
</p:selectBooleanButton>
这样,只有当用户实际按下按钮时才会触发该操作。
为了使按钮以可视方式更新,您需要添加 update
属性为poll
:
<p:poll
interval="5"
process="sbbActivateTask"
update="selectBooleanButton" />
关于java - 为什么 Primefaces 不刷新我的按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21117073/