-1
//StockPriceEmitter is a "dead loop" thread which generate data, and invoke StockPriceService.onUpdates() to send data.
@Service
public class StockPriceService implements StockPriceEmitter.Listener
{
    @Inject
    private BayeuxServer bayeuxServer;
    @Session
    private LocalSession sender;

    public void onUpdates(List<StockPriceEmitter.Update> updates)
    {
        for (StockPriceEmitter.Update update : updates)
        {
            // Create the channel name using the stock symbol
            String channelName = "/stock/" + update.getSymbol().toLowerCase(Locale.ENGLISH);

            // Initialize the channel, making it persistent and lazy
            bayeuxServer.createIfAbsent(channelName, new ConfigurableServerChannel.Initializer()
            {
                public void configureChannel(ConfigurableServerChannel channel)
                {
                    channel.setPersistent(true);
                    channel.setLazy(true);
                }
            });

            // Convert the Update business object to a CometD-friendly format
            Map<String, Object> data = new HashMap<String, Object>(4);
            data.put("symbol", update.getSymbol());
            data.put("oldValue", update.getOldValue());
            data.put("newValue", update.getNewValue());

            // Publish to all subscribers
            ServerChannel channel = bayeuxServer.getChannel(channelName);
            channel.publish(sender, data, null); // this code works fine
            //this.sender.getServerSession().deliver(sender, channel.getId(), data, null); // this code does not work
        }
    }
}

这条线channel.publish(sender, data, null); // this code works fine工作正常,现在我不想频道向所有订阅它的客户端发布消息,我想发送给特定的客户端,所以我写了这个this.sender.getServerSession().deliver(sender, channel.getId(), data, null);,但它不起作用,浏览器无法获取消息。

提前谢谢。

4

1 回答 1

0

我强烈建议您花一些时间阅读CometD 概念页面,尤其是关于会话的部分

您的代码不起作用,因为您将消息发送给发件人,而不是收件人

您需要从ServerSession可能连接到服务器的众多远程服务器中选择要将消息发送到的远程服务器,然后调用serverSession.deliver(...)该远程服务器会话。

如何选择遥控器ServerSession取决于您的应用程序。

例如:

for (ServerSession session : bayeuxServer.getSessions())
{
    if (isAdminUser(session))
        session.deliver(sender, channel.getId(), data, null);
}

当然,您必须提供isAdmin(ServerSession)您的逻辑的实现。

请注意,您不需要遍历会话:如果您碰巧知道要传递到的会话 ID,则可以执行以下操作:

bayeuxServer.getSession(sessionId).deliver(sender, channel.getId(), data, null);

另请参阅 CometD 发行版随附的CometD 聊天演示,其中包含有关如何向特定会话发送消息的完整示例。

于 2013-10-05T10:12:12.140 回答