I'm new to Primefaces and JSF in general. I have been trying to get a datagrid to update via Push. I do this by submitting a form to alter a list in a backing bean and then push an event to update the component. However this only works if I open a second browser, i.e. I submit the form in the originating browser, the datagrid doesn't update or fire the event handlers, however it works perfectly in a second browser window. I don't really understand why this is the case.
These are my javascript handlers:
Code: Select all
<script type="text/javascript">
function handleMessage(data)
{
console.log("handle message fired")
console.log(data);
updateWidgets();
}
function handleOrder(data)
{
console.log("handleorder fired")
console.log(data);
checkOrders();
}
</script>
Code: Select all
<p:socket onMessage="handleMessage" channel="/prices" />
<p:remoteCommand name="updateWidgets"
actionListener="#{parliamentManager.findLatestPrices}"
update="resultDisplay"/>
<p:socket onMessage="handleOrder" channel="/order" />
<p:remoteCommand name="checkOrders"
actionListener="#{parliamentManager.checkOrders}" />
Code: Select all
@PushEndpoint("/prices")
public class PricesResource {
private static final Logger logger = Logger.getLogger("web.PricesResource");
@OnMessage(encoders = {JSONEncoder.class})
public OrderBook onMessage(OrderBook orderBook) throws InterruptedException {
logger.log(Level.INFO, "PricesResource.onMessage price {0}", orderBook.getPrice());
return orderBook;
}
}
Code: Select all
@PushEndpoint("/order")
public class OrderResource {
@OnMessage(encoders = {JSONEncoder.class})
public Object onMessage(Object obj) {
return obj;
}
}
Code: Select all
<h:panelGroup id="resultDisplay">
<p:dataGrid id="prices" var="orderBooks" value="#{parliamentManager.latestPricesResults}" columns="3" rows="12">
<p:column>
<p:panel header="#{orderBooks.bidOrderId.member.memberId}">
<h:panelGrid columns="1">
<h:outputText value="#{orderBooks.price}" />
</h:panelGrid>
</p:panel>
</p:column>
</p:dataGrid>
</h:panelGroup>
Thanks,
Zobbo