【问题标题】:CometD: Process broadcast messages before broadcastingCometD:在广播之前处理广播消息
【发布时间】:2016-04-13 05:01:22
【问题描述】:

我在码头内运行了一个 cometd 应用程序。我想从客户端获取传入的广播,然后进行一些处理(涉及与数据库交互),然后在没有遇到错误的情况下通过向所有订阅者广播来完成。

我最初的想法是通过扩展来做到这一点,但是有没有更合适的方法?


这是我根据@sbordet 回答修改后的尝试:

@Inject
private BayeuxServer bayeux;
@Session
private ServerSession serverSession;

    @Listener("/service/*")
    public void handle(ServerSession remote, ServerMessage message) {
        System.out.println("Message received on service: " + message);

        String broadcastChannel = message.getChannel().replace("/service", "");
        System.out.println("bayeux: " + bayeux + " - sending: " + broadcastChannel + " - " + message.getData());
        System.out.println("bayeux.getChannel(broadcastChannel): " + bayeux.getChannel(broadcastChannel));
        bayeux.getChannel(broadcastChannel).publish(serverSession, message.getData());
    }

本质上,我想监听所有服务频道,并进行一些处理,然后发布到同一个广播频道,而不是 /service。所以,/service/test 变成了 /test。

此电流为 bayeux.getChannel(broadcastChannel) 返回一个空值

【问题讨论】:

    标签: java jetty cometd


    【解决方案1】:

    因为你描述的是CometD内部正常的消息处理,所以不要使用extensions,而是services

    在您想要修改作为 CometD 核心的 Bayeux 协议行为的情况下,应使用扩展。

    另一方面,服务是处理应用程序交换的业务消息的便捷方式,因此非常适合您的情况。

    【讨论】:

    • 当我使用bayeux.getChannel(broadcastChannel)); 然后getChannel() 方法返回null...
    • 我正在使用服务频道/service/test,然后通过/test 进行广播——这似乎是正确的语义。但是bayeux(通过Spring注入)为getChannel('/test')返回null
    • BayeuxServer.getChannel(String) 在您先验地知道通道已经存在时使用。否则使用BayeuxServer.createChannelIfAbsent(...)。阅读the documentation 了解如何配置和初始化通道。
    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 2013-09-09
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多