-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);が、機能しません。ブラウザはメッセージを取得できません。

事前にt​​hx。

4

1 に答える 1

0

CometD の概念ページ、特にセッションに関するセクションを読むことを強くお勧めします。

メッセージを受信者ではなく送信者に送信しているため、コードは機能しません。

ServerSessionサーバーに接続されている可能性のある多くのリモートの中からメッセージを送信するリモートを選択しserverSession.deliver(...)、そのリモート ServerSession を呼び出す必要があります。

リモートの選択方法は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 に答える