XPages:观察者和可观察者
XPages: Observer and Observable
我一直在尝试在多用户 XPages 应用程序中使用 Java Observer 和 Observable,但我 运行 陷入身份冲突。我会解释。
假设 A 和 B 在他们的屏幕上有相同的视图,即带有读者字段的文档列表。我们希望尽可能保持这些屏幕同步。如果 A 更改了某些内容,B 可能会收到更新,这取决于他的权利和角色。我们使用 WebSockets 做到了这一点,但我想看看是否有更好的方法,即不向客户端发送消息告诉它重新获取屏幕。
使用Observer机制,B可以观察到变化,并将变化的画面推送给用户。这里棘手的部分是,如果我以用户 A 的身份调用 notifyObservers,并且遍历所有可观察对象,A 将执行 Observer.update()
方法,而不是 B。
我也考虑过使用类似 Timer 的解决方案,但我可能会遇到同样的冲突。
问题:是否有任何方法可以在 XPages 中正确切换会话?或者我应该在 XPages 服务器中等待 Publish/Subscribe?
我可以看到 3 个可能的操作:
- 代用从XPages-Scaffolding到运行代码的SudoUtils
- 使用 DominoJNA 以不同的用户 ID 访问数据(胆小者勿入)
- 只需使用 websocket 通知客户端 - 最好通过 webworker。然后它会进行一次获取(以前称为 Ajax 的艺术家)以查看客户端是否需要更改 UI。虽然这有导致网络插曲(websocket + fetch)的缺点,但它的优点是你不需要搞砸总是有出错风险的模拟。
对于前两个,我想将它们打包到一个 OSGi 包中,以独立于从 NSF
加载的 Java 的特殊性
旧答案
Your observer needs to be in an application context, so you can update any Observer. The observer then would use a websocket to the client to tell it: update this ONE record.
The tricky part, needs planning: have individual websocket addresses, so you notify only the ones that need notification
我一直在尝试在多用户 XPages 应用程序中使用 Java Observer 和 Observable,但我 运行 陷入身份冲突。我会解释。
假设 A 和 B 在他们的屏幕上有相同的视图,即带有读者字段的文档列表。我们希望尽可能保持这些屏幕同步。如果 A 更改了某些内容,B 可能会收到更新,这取决于他的权利和角色。我们使用 WebSockets 做到了这一点,但我想看看是否有更好的方法,即不向客户端发送消息告诉它重新获取屏幕。
使用Observer机制,B可以观察到变化,并将变化的画面推送给用户。这里棘手的部分是,如果我以用户 A 的身份调用 notifyObservers,并且遍历所有可观察对象,A 将执行 Observer.update()
方法,而不是 B。
我也考虑过使用类似 Timer 的解决方案,但我可能会遇到同样的冲突。
问题:是否有任何方法可以在 XPages 中正确切换会话?或者我应该在 XPages 服务器中等待 Publish/Subscribe?
我可以看到 3 个可能的操作:
- 代用从XPages-Scaffolding到运行代码的SudoUtils
- 使用 DominoJNA 以不同的用户 ID 访问数据(胆小者勿入)
- 只需使用 websocket 通知客户端 - 最好通过 webworker。然后它会进行一次获取(以前称为 Ajax 的艺术家)以查看客户端是否需要更改 UI。虽然这有导致网络插曲(websocket + fetch)的缺点,但它的优点是你不需要搞砸总是有出错风险的模拟。
对于前两个,我想将它们打包到一个 OSGi 包中,以独立于从 NSF
加载的 Java 的特殊性旧答案
Your observer needs to be in an application context, so you can update any Observer. The observer then would use a websocket to the client to tell it: update this ONE record. The tricky part, needs planning: have individual websocket addresses, so you notify only the ones that need notification