2013-10-05 3 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의 베 이유는 특정 클라이언트

xx 미리.

답변

0

CometD concepts 페이지, 특히 section about sessions 페이지를 읽는 것이 좋습니다.

당신이하지 받는 사람 때문에, 보낸 사람에 메시지를 전송하기 때문에 귀하의 코드가 작동하지 않습니다.

ServerSession 리모컨을 선택하여 서버에 연결되어있는 많은 사람에게 메시지를 보내고 해당 원격 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 chat demo 참조 특정 세션에 메시지를 보내는 방법에 대한 완전한 본보기가 포함되어 있습니다.