CUBA 平台将消息从后端推送到 UI

Posted

技术标签:

【中文标题】CUBA 平台将消息从后端推送到 UI【英文标题】:CUBA Platform push messages from backend to UI 【发布时间】:2020-11-16 11:02:01 【问题描述】:

我想知道是否可以从后端(例如,从外部系统接收信息的正在运行的任务)向 UI 发送消息。在我的情况下,它需要是一个特定的会话(没有广播)并且只在一个特定的屏幕上

plan B 会经常轮询后端,但我希望得到更“实时”的东西

我试图解决这样的问题,但我不断收到 NotSerializableException。

@Push
class StorageAccess : Screen(), MessageListener 
    @Inject
    private lateinit var stationWSService: StationWebSocketService
    @Inject
    private lateinit var notifications: Notifications

    @Subscribe
    private fun onInit(event: InitEvent) 
    

    @Subscribe("stationPicker")
    private fun onStationPickerValueChange(event: HasValue.ValueChangeEvent<StorageUnit>) 
        val current = AppUI.getCurrent()
        current.userSession.id ?: return

        val prevValue = event.prevValue
        if (prevValue != null) 
            stationWSService.remove(current.userSession.id)
        
        val value = event.value ?: return

        stationWSService.listen(current.userSession.id, value, this)
    

    override fun messageReceived(message: String) 
        val current = AppUI.getCurrent()
        current.access 
            notifications.create().withCaption(message).show()
        

    

    @Subscribe
    private fun onAfterDetach(event: AfterDetachEvent) 
        val current = AppUI.getCurrent()
        current.userSession.id ?: return
        stationWSService.remove(current.userSession.id)
    


-- 回调接口

interface MessageListener : Serializable 
    fun messageReceived(message: String);

-- 我的后端服务的监听方法

private val listeners: MutableMap<String, MutableMap<UUID, MessageListener>> = HashMap()
override fun listen(id: UUID, storageUnit: StorageUnit, callback: MessageListener) 
    val unitStationIP: String = storageUnit.unitStationIP ?: return

    if (!listeners.containsKey(unitStationIP))
        listeners[unitStationIP] = HashMap()

    listeners[unitStationIP]?.set(id, callback)

我得到的异常是NotSerializableException: com.haulmont.cuba.web.sys.WebNotifications,它在将监听器添加到后端时发生:stationWSService.listen(current.userSession.id, value, this)

据我了解,这是 UI 将信息发送到后端的地方 - 以及 StorageAccess 类的整个状态,包括其所有成员。

有没有优雅的解决方案?

问候

【问题讨论】:

【参考方案1】:

有一个插件可以解决这个问题:https://github.com/cuba-platform/global-events-addon

【讨论】:

太棒了,看起来很有希望。我试过了,它奏效了。有什么优雅的方式可以将它发送给某些用户/会话吗?否则我仍然可以使用它并找到解决方法 也许您可以在事件中发送用户名或会话 ID,然后在侦听器中将传入信息与当前用户会话进行比较,而忽略不同用户的事件。

以上是关于CUBA 平台将消息从后端推送到 UI的主要内容,如果未能解决你的问题,请参考以下文章

使用Pushlet将消息从服务器端推送到客户端

电商平台实时监控系统丨前端项目的准备

CUBA-Platform将全面助力中国开发者

Quickblox - 如何将通知推送到 Android 和 iOS 平台?

Angular 2 如何从后端读取自定义错误消息

requirejs 与cuba 冲突文件解决