2016-07-27 2 views
-1

У меня есть два клиентских приложения, которые используют CometD для общения с сервером. Мой сервер отправляет некоторые данные моим клиентам, используя метод доставки() ServerSession. Данные представлены в виде строки.Данные CometD не достигают клиента

Одно из моих приложений - это веб-приложение на основе Javascript. Я могу получить доступ к данным, поставляемых сервер следующим образом:

function(theMsg) { 
    alert(theMsg.data); 
} 

Это хорошо работает как обратный вызов, когда я хочу, чтобы отправить данные по определенному каналу.

К сожалению, моим вторым приложением является Java-приложение, чей обратный вызов, похоже, не способен получить данные. Обратный вызов работает следующим образом:

public void onMessage(ClientSessionChannel channel, Message message) 
{ 
    String data = (String)theMsg.getData(); 
    System.out.println("Data "+data); 
} 

Проблема здесь состоит в том, что GetData() по какой-то причине возвращает нуль в Java. Я не могу найти способ получить данные, которые я отправил с сервера!

Есть ли какая-то ошибка в java CometD API, или я использую неправильную функцию для получения данных, которые я отправляю с сервера? Как я могу получить эти данные?

Кто-то пожалуйста, сообщите ...

Дополнение 1: ниже является первым клиентом, реализованная в Javascript, по просьбе sbordet. Этот клиент работает ...

var cometD = $.cometd; 

var isConnected = false; 

var rcvHandshake = function(hndValue) { 
    console.log("Received handshake. Success flag is " + hndValue.successful); 
} 

var amConnected = function(msgConnect) { 
    if(cometD.isDisconnected()) 
    { 
     isConnected = false; 
     console.log("Server connection not established!"); 
    } 
    else 
    { 
     var prevconnected = mySelf.isConnected; 

     // This checks whether or not the connection was actually successful 
     isConnected = msgConnect.successful === true; 
     if((prevconnected == false) && (isConnected == true)) 
     { 
      console.log("Connected to the server!"); 
      cometD.addListener("/service/output",updateOutput); 
     } 
     else if((prevconnected == true) && (isConnected == false)) 
     { 
      console.log("Connection to server has ended!") 
     } 
    } 

} 

var startUp = function() { 
    console.log("Starting up..."); 

    var cometURL = $(location).attr('origin') + "/tester/cometd"; 
    cometD.configure({ 
     url: cometURL, 
     logLevel: 'info' 
    }); 

    cometD.addListener('/meta/handshake',rcvHandshake); 
    cometD.addListener('/meta/connect',amConnected); 

    cometD.handshake({ 
     "thehash.autohash": "foo-bar-baz-hash" 
    }); 

} 

var updateOutput = function(theOut) { 
    alert(theOut.data); 
} 
+0

Пожалуйста, покажите полный код вы используете как в JavaScript и Java. В библиотеке CometD есть концепция обратного вызова _message_, которая используется для получения ответа от сервера, который достиг сообщения на сервере, и концепции слушателя _message/абонента, который используется для приема сообщений, полученных от сервера. Без полного кода клиента неясно, на что вы ссылаетесь. Возможно, вы используете правильный API в JavaScript, а другой - в Java. – sbordet

+0

Okaaaay ... Я прекрасно понимаю концепцию сообщений CometD, а клиентский код для обоих языков довольно стандартный и простой (я думаю). Тем не менее я добавлю код в соответствии с запросом ... –

ответ

0

Я решил проблему.

Я просматривал свой Java-код, чтобы отформатировать его для публикации на этот вопрос, когда я заметил опечатку в именах каналов, которые я слушал. Я исправил опечатку, которая включала канал, который я использовал для публикации запросов на сервер (видимо, слушатель, которого я использовал, был активирован до возвращения данных), и в результате метод getData() был пуст.

Отправка данных на правильный канал решила проблему. Мой метод getData() больше не возвращает null.

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

Отдельного спасибо sbordet для запроса полного кода, который вызвал меня повторно рассмотреть ее и найти свою опечатку ...