触发通过推送消息重新绘制wicket组件

时间:2013-11-20 15:58:58

标签: websocket wicket

我理解使用add(Component)的{​​{1}}方法重新绘制wicket组件的概念 - 但我只能在客户端触发某个ajax事件时使用此方法。

但我必须重新绘制一个组件而不涉及任何用户交互,所以我不能使用它。下一步是发现AjaxRequestTarget及其相关方法WebSocketBehavior - 此消息再次获取类型为onMessage()的参数(将WebSocketRequestHandler扩展为),我可以将其添加到 - 待重新绘制组件。但是,当客户端向服务器发送websocket消息时,似乎只会调用此方法。

最后,我发现我可以通过打开AjaxRequestTarget从服务器端触发异步消息。 Wicketinaction在此博客文章(http://wicketinaction.com/2012/07/wicket-6-native-websockets/)中建议使用以下代码行:

IWebSocketConnection

wsApplication,wsSessionId和wsPageId是在WebSocketBehavior的IWebSocketConnectionRegistry registry = new SimpleWebSocketConnectionRegistry(); Application application = Application.get(wsApplicationName); IWebSocketConnection wsConnection = registry.getConnection(application, wsSessionId, wsPageId); if (wsConnection != null && wsConnection.isOpen()) { try { wsConnection.sendMessage("test"); } catch (IOException e) {} } 方法中获得的。

一般来说,这种方法有效 - 我可以将测试消息发送给客户端,它会收到这个文本。但我找不到如何使用此方法触发组件重绘的方法。对此有任何建议将不胜感激 - 或者我到底完全错了?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

看一下https://github.com/papegaaij/wicket-atmosphere-quickstart/,这是一个通过大气层(图书馆使用WebSockets或后备)将当前时间作为Wicket Component反复推送的示例。

它基于wicket-atmosphere,这反过来使Wicket中的Atmosphere可用。该模块被认为是实验性的,因此位于Wicket的存储库中。尽管如此,它看起来非常可靠,绝对值得一试。

以下片段取自上述示例,但请务必阅读Atmosphere的文档和wicket-atmosphere代码以了解其API。基本上,您可以创建一个中央事件调度程序并使用注释标记方法,根据需要格式化事件并通过提供的AjaxRequestTarget发送。

从后台作业向中央事件调度程序创建事件:eventBus.post(new Date());

转换事件并发送为Component

@Subscribe
public void updateTime(AjaxRequestTarget target, Date event) {
    timeLabel.setDefaultModelObject(event.toString());
    target.add(timeLabel);
}