Мы создали базовую службу 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);
}
}