У меня есть веб-приложение на Java, которое использует CometD. Рабочий процесс прост:
- Я определил службу, которая действует при получении сообщений по каналу "/ service / hello". Этот сервис ожидает параметр "имя". На основании этого он создает канал с именем:
"/"+message.getDataAsMap().get("name")
. К этому каналу он присоединяет метод обратного вызова, который отправит сообщение всем подписчикам.
- Клиент 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(); }
}
}
}