2013-08-16 2 views
3

Каков наилучший способ перезапустить сеанс cometd после того, как старый истек? В частности, при использовании библиотеки Javascript CometD и API потоковой передачи Salesforce.Salesforce Streaming API: переключение на Cometd после окончания сессии

В настоящее время я пытаюсь написать серию веб-страниц, которые используют API потоковой передачи Salesforce, который работает с использованием Cometd, для автоматического обновления данных на странице. Это работает нормально, но теперь я пытаюсь решить, что делать после окончания сессии.

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

$.cometd.clearListeners(); 
$.cometd.init({ 
       url:window.location.protocol+'//'+window.location.hostname+'/cometd/28.0/', 
       requestHeaders: { Authorization: 'OAuth {!$Api.Session_ID}'} 
      }); 
      [Initialize Subscriptions] 

Это работает нормально, но не без некоторых проблем, которые я бы хотел избежать.

Похоже, если я получаю звонок по моим подпискам до того, как код, указанный выше, запускается во второй раз, мои обработчики подписки дважды срабатывают при следующем вызове, который он ловит. Я попытался заменить $ .cometd.init $ .cometd.handshake, но это, похоже, не работало, если мои подписки не получили вызов до того, как код выше был вызван в 2-й раз. Я также попытался вызвать $ .cometd.disconnect, но это, казалось, блокировало любые вызовы от доступа к моим подпискам после того, как я вызываю эту функцию, даже если я запускаю ее синхронно.

Я делаю это правильно, а 20-секундный интервал - это беспорядок или есть лучший способ сделать это?

+0

с использованием раствора подробно в принятом ответе, ваши clearListeners() больше надо? –

ответ

2

Я отвечаю с CometD.

Лучший способ перезапуска сеанса CometD после истечения срока действия старого - ничего не делать.

CometD имеет функцию автоматического повторного подключения, поэтому, если сетевое соединение прекращается и сеанс заканчивается, CometD будет автоматически повторять попытку, пока не удастся снова подключиться к серверу с интервалом задержки между попытками.

Для того, чтобы гарантировать, что ваши подписки будут восстановлены при повторном рукопожатии, вам нужно просто следовать за the guidelines, в частности выполнять подписки от успешного слушателя /meta/handshake.

Если вы хотите протестировать поведение кода JavaScript в случае разъединения, вам просто нужно создать отключение, а не звонить cometd.init() дважды. Вы можете убить сервер, отключите сетевой кабель, Undeploy веб-приложение, и т.д.

Если вы явно отключить клиента, то вы должны повторно рукопожатия вручную:

cometd.init(...); 
... 

// Disconnect 
cometd.disconnect(); 
// Wait a while, then re-handshake 
cometd.handshake(); 

Обратите внимание, что вы сусло «Подождите некоторое время», потому что cometd.disconnect() является асинхронным. Кроме того, вы можете сделать:

cometd.init(...); 
... 

// Disconnect and re-handshake when fully disconnected 
cometd.addListener('/meta/disconnect', function(message) 
{ 
    cometd.handshake(); 
}); 
cometd.disconnect(); 

// Another solution, using setTimeout() 
cometd.disconnect(); 
window.setTimeout(function() 
{ 
    cometd.handshake(); 
}, 5000); 
+0

Спасибо за ответ! Я нигде не использовал слушателей, что было моей главной проблемой. Поэтому, помимо необходимости делать рукопожатие на прослушивании «meta/disconnect», мне также нужно добавить слушателя для «/ meta/handshake», чтобы начать подписку. Это работает. – atarinesgeek

+0

Я получаю ошибку 401, когда я пытаюсь выполнить рукопожатие. У меня есть BaseURL, токен доступа, который я добавил в поле заголовка запроса.Пожалуйста, дайте мне знать, что я делаю неправильно. – Abhi

+0

Ошибка HTTP 401 означает, что вы пытаетесь получить доступ к странице, требующей учетных данных. Вероятно, вы пытаетесь получить доступ к неправильной странице или с неправильными учетными данными. – sbordet