Публикация сообщений с использованием Java-клиента CometD, которые могут использоваться подписчиками Javascript - PullRequest
4 голосов
/ 05 октября 2011

У меня есть веб-приложение на Java, которое использует CometD. Рабочий процесс прост:

  1. Я определил службу, которая действует при получении сообщений по каналу "/ service / hello". Этот сервис ожидает параметр "имя". На основании этого он создает канал с именем: "/"+message.getDataAsMap().get("name"). К этому каналу он присоединяет метод обратного вызова, который отправит сообщение всем подписчикам.
  2. Клиент Javascript (использует dojo) публикует сообщение на канал "/ service / hello" и подписывается на канал, чье имя отправлено в "/ service / hello" в качестве параметра. Давайте возьмем пример:
....
    cometd.subscribe('/1234', function(message)
    {
                    //do smth on message received;
     });

    cometd.publish('/service/hello', { name: '1234' });
....

Это отлично работает. Теперь я хочу добиться следующего: иметь клиентов Javascript только в качестве подписчиков и клиента Java, который выполняет публикацию. Я попробовал это, используя примеры, приведенные в документации по CometD2 для Java Client API, но это не работает, как ожидалось. Кажется, что служба вызывается, но сообщения не видны потребителями Javascript.

Возможно ли этого добиться? Есть идеи, что не так? Спасибо.

Вот код на стороне сервера:

public class HelloService extends AbstractService {
    public HelloService(BayeuxServer bayeux)
    {
        super(bayeux, "hello");
        addService("/service/hello", "processHello");
    }

    public void processHello(ServerSession remote, Message message)
    {
        Map<String, Object> input = message.getDataAsMap();
        String name = (String)input.get("name");
        String channelId = "/"+name;
        addService(channelId, "processId");
        processId(remote, message);

    }

    public void processId(ServerSession remote, Message message)
    {
        Map<String, Object> input = message.getDataAsMap();
        String name = (String)input.get("name");
        int i = 0;
        Map<String, Object> output = new HashMap<String, Object>();
        while(i<1){
            i++;
            output.put("greeting", "Hello, " + name);
            remote.deliver(getServerSession(), "/"+name, output, null);
            try {
                Thread.sleep(1000);             } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();            }
        }
    } 
}

1 Ответ

3 голосов
/ 05 октября 2011

remote.deliver() отправляет «ответ» сеансу remote (то есть клиенту), который опубликован на канале обслуживания.

Вам следует опубликовать незапрошенное сообщение на обычном канале (который на стороне сервера еще не существует). Итак, вы должны написать что-то вроде

String channelName = "whatever - not beginning with /service";
getBayeux().createIfAbsent(channelName);
getBayeux().getChannel(channelName).publish(getServerSession(), output, null); 
...