Hi,
Few weeks ago I created a patch that provides a way to push convert external events into wicket events that allow components to update themselves and push the
results back to all browsers that have open websocket connection to the wicket application.
I put the first version of the patch here
https://issues.apache.org/jira/browse/WICKET-4832
The API is pretty simple:
Pass reference to wicket application to any non-wicket thread:
WebSocketPushBroadcaster pusher = new WebSocketPushBroadcaster();
pusher.broadcastAll(applicationRef, new ExternalSourcePush("pass relevant data to
components"));
where
static class ExternalSourcePush implements IWebSocketPushMessage { ... }
The wicket components that have active websocket connections will then receive
a normal wicket websocket event:
public void onEvent(IEvent<?> event) {
if (event.getPayload() instanceof WebSocketPushPayload) {
WebSocketPushPayload wsEvent = (WebSocketPushPayload) event.getPayload();
ExternalSourcePush data = (ExternalSourcePush) wsEvent.getMessage()
label.setDefaultModelObject(data.message);
wsEvent.getHandler().add(label);
}
}
Alternatively you can just pass a specific wicket websocket ConnectionMessage
and use that as a context to send the events to.
---
TODO items:
1) I was trying to add a Class<? extends Page> filter to the broadcastAll first so that I could get only the relevant websocket connections from the registry
and not all pages need to be touched. In that case websocket registry would need to be updated to keep track of also page classes, not just their pageId, or is
there a easy way to map from pageId to page class?
Or do you think the broadcastAll that loops through all active websocket
connections is not too heavy?
2) testing framework
-Mikko