Проблема клиента Cometd / Bayeux

Мы создали базовую службу Windows .Net для использования событий платформы из Salesforce (всякий раз, когда определенный объект, созданный / обновленный в Salesforce, хочет получить информацию). Мы используем клиент Cometd / bayeux для подписки на события платформ Salesforce.

Первоначально все работает нормально, мы получаем данные всякий раз, когда в объекте Salesforce произошло изменение, но после нескольких часов простоя (около 1-2 часов) данные не поступают. Проверьте статус клиента bayeux, он отображается как подключенный, но подписка не происходит. Когда мы перезапускаем сервис, он начинает работать. Используя приведенный ниже код для подключения и подписки. Может ли кто-нибудь помочь в этом.

 public void CheckAndSubscribe()
    {
        if (!_bayeuxClient.IsConnected())
        {
            _logger.LogInformation("Bayeux client not connected. trying to connect...");
            try
            {
                SalesforceSession salesforceSessionData = _sfSessionAdapter.GetSalesforceSession();
                _bayeuxClient.Connect(salesforceSessionData.Url, salesforceSessionData.SessionId);

                List<string> sfChannels = _syncSalesforceConfiguration.BayeuxClientConfiguration.ExternalChannels;

                foreach (string channel in sfChannels)
                {
                    _bayeuxClient.Subscribe(channel, _messageListener);
                }
                _logger.LogInformation("Bayeux client connected and channels subscribed...");
            }
            catch (Exception ex)
            {
                _logger.LogException(ex);
            }

        }
    }
 public class BayeuxClientAdapter : IBayeuxClientAdapter
{
    BayeuxClient _bayeuxClient = null;
    private readonly SyncSalesforceConfiguration _syncSalesforceConfiguration;
    public BayeuxClientAdapter(IOptions<SyncSalesforceConfiguration> syncSalesforceConfiguration)
    {
        _syncSalesforceConfiguration = syncSalesforceConfiguration.Value;
    }
    public bool IsConnected()
    {
        return _bayeuxClient?.Connected ?? false;
    }

    public void Connect(string instanceUrl, string authToken)
    {
        int readTimeOut = 120 * 1000;
        string streamingEndpointURI = _syncSalesforceConfiguration.BayeuxClientConfiguration.StreamingEndpointUri;

        IDictionary<string, object> options = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase)
        {
            { ClientTransport.TIMEOUT_OPTION, readTimeOut },
            { ClientTransport.MAX_NETWORK_DELAY_OPTION, 120000 }
        };

        var headers = new NameValueCollection { { HttpRequestHeader.Authorization.ToString(), $"OAuth {authToken}" } };

        var clientTransport = new LongPollingTransport(options, headers);

        var serverUri = new Uri(instanceUrl);
        String endpoint = String.Format("{0}://{1}{2}", serverUri.Scheme, serverUri.Host, streamingEndpointURI);

        _bayeuxClient = new BayeuxClient(endpoint, new[] { clientTransport });
    }

    public void DisConnect()
    {
        if (IsConnected())
        {
            _bayeuxClient?.ResetSubscriptions();
            _bayeuxClient?.Disconnect();
            _bayeuxClient?.WaitFor(1000, new[] { BayeuxClient.State.DISCONNECTED });
        }
    }

    public void Subscribe(string channel, IMessageListener listener)
    {
        _bayeuxClient.Handshake();
        _bayeuxClient.WaitFor(1000, new[] { BayeuxClient.State.CONNECTED });

        var sfChannel = _bayeuxClient.GetChannel(channel);
        sfChannel.Subscribe(listener);
    }
}

person Aneesh    schedule 24.11.2019    source источник


Ответы (1)


Если на канале нет активности, сервер закрывает соединение через определенное время.

В это время клиент получает код состояния 403 (Неизвестный клиент), и клиент должен снова подтвердить связь в течение 110 секунд.

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

Как только соединение будет восстановлено, все подписки на каналы будут удалены ComedD, и мы должны снова подписаться на канал, чтобы получать события.

Для этого мы должны использовать обратный вызов meta / Handshake, чтобы снова подписаться на канал.

person Jasneet Dua    schedule 11.09.2020