2013-10-05 4 views
-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 работает отлично, теперь я не хочу канал опубликовать сообщение всем клиентам subscirbed с ним, я хочу, чтобы отправить конкретному клиенту, так Я пишу это this.sender.getServerSession().deliver(sender, channel.getId(), data, null);, но он не работает, браузер не может получить сообщение.cometd Байе не может отправить сообщение конкретному клиенту

THX заранее.

ответ

0

Я настоятельно рекомендую вам потратить некоторое время на чтение страницы CometD concepts, в частности section about sessions.

Ваш код не работает, потому что вы отправляете сообщение отправителя, а не к получателю.

Вам нужно выбрать, какой удаленный ServerSession вы хотите отправить сообщение, среди многих, которые могут быть подключены к вашему серверу, и вызывать serverSession.deliver(...) на этом удаленном сервере ServerSession.

Как выбрать пульт дистанционного управления ServerSession зависит от вашего приложения.

Например:

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

Вы должны обеспечить реализацию isAdmin(ServerSession) с вашей логике, конечно.

Обратите внимание, что вам не нужно перебирать сессии: если вы будете знать идентификатор сеанса для доставки, вы можете сделать:

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

Также см CometD chat demo поставляется с распределением CometD , которые содержат полноценный пример того, как отправить сообщение в определенный сеанс.

Смежные вопросы