Отправка сервера с использованием COMETD на клиент (додзё)

Я пытаюсь отправить сообщение с сервера на клиент. Я использую DOJO 1.7, Cometd и Jetty, интегрированные с tomcat6.

 //Server side code
   public class notificationService extends AbstractService {

public notificationService(BayeuxServer bayeux, String name) {
    super(bayeux, name);
    System.out.println("Inside constrcutor of Notification Service");
    addService("/notification", "processNotification");
}


    public void processNotification(ServerSession remote,ServerMessage.Mutable message)      
        {
    System.out.println("Inside process Notification");
    Map<String,Object> response = new HashMap<String,Object>();
    response.put("payload",new java.util.Date());
            getBayeux().createIfAbsent("/notification");
          getBayeux().getChannel("/notification").publish(getServerSession(),response,null);
            //remote.deliver(getServerSession(),"/notification", response, null);
        }

      //Client Side Code (DOJO)

       var cometd = dojox.cometd;
       cometd.init("http://serverip:port/cometd")
       cometd.publish('/notification',{ mydata: { foo: 'bar' } });
       cometd.subscribe('/notification', function(message)
            {
                    //alert("Message received" + message.data.payload);
                    //alert(message.data.payload);
                    alert("Message received");
            });

Я хочу передать сообщение всем клиентам, подписавшимся на определенный канал. Когда я использую remore.deliver, он отправляет сообщение отдельному клиенту, но не всем клиентам, подписанным на этот канал. Channel.publish у меня не работает... любая помощь и комментарии очень ценятся.


person mayank    schedule 06.09.2012    source источник


Ответы (1)


Ваш клиент публикуется на канале /notification, который является широковещательным (см. http://docs.cometd.org/reference/#concepts_channels для определения), так что сообщение будет не только получено вашей службой, но и передано всем подписчикам этого канала.

Затем в вашем сервисе вы вызываете ServerChannel.publish(), который отправит другое сообщение подписчикам канала /notification (кроме самого сервиса - есть предотвращение бесконечного цикла).

Лучший способ выполнить такого рода действия — использовать канал службы, например /service/notification, для отправки исходного сообщения от вашего клиента службе. Тогда сервис сможет вещать, как сейчас, на канал /notification.

Звонок по номеру ServerChannel.publish() — это правильный способ широковещательной рассылки сообщений от службы. К сожалению, вы не указываете, почему именно у вас не работает, поэтому я не могу помочь.

Я бы начал с использования служебного канала между вашим клиентом и службой для первого сообщения.

Также обратите внимание, что Tomcat 6 на самом деле не лучшее решение для CometD, поскольку он не поддерживает асинхронные сервлеты (Servlet 3).

Лучше использовать совместимый с Servlet 3 контейнер, такой как Jetty 8.

person sbordet    schedule 06.09.2012