我有p:dataTable
显示每行的金融工具和实时价格,我想使用p:socket
设置广播频道,每行一个频道。目标是当单个工具的新价格到来时,我只能更新其单元格以获得更好的性能。
首先,我尝试从showcase's chat example复制聊天示例,并从服务器端订阅动态通道,但这样客户端无法获取消息所在的通道(并且{ {1}}处理多个渠道?)。
然后,我尝试在dataTable中插入p:socket
:
p:socket
并在服务器端:
<p:dataTable var="instrument" … >
<p:socket onMessage="handleMessage(#{instrument.id})" channel="/price" autoConnect="false"
widgetVar="subscriber_#{instrument.id}" />
…
</p:dataTable>
但这会在客户端引发错误:
for (Instrument instrument : instruments) {
RequestContext.getCurrentInstance().execute("subscriber_" +instrument.getId() + ".connect('/" + instrument.getId() + "')");
}
还有其他方法吗?我在客户端或服务器端管理订阅没有问题,唯一重要的是我不想将所有价格都推到所有客户端。
使用PrimeFaces 3.4.1
答案 0 :(得分:0)
如果您仍然无法使其正常工作,请按以下步骤动态订阅/连接频道。
RequestContext.getCurrentInstance().execute("subscriber.connect('/" + instrument.getId() + "')");
您的数据表中不需要多个<p:socket>
。单个套接字足以处理所有发布/订阅。