We have created .Net core windows service for consuming platform events from Salesforce(whenever a particular object created/updated in Salesforce want to fetch the information).We are using Cometd/bayeux client for subscribing Salesforce platforms events.
Initially everything working fine we are getting data whenever a change happened in Salesforce object,but after few idle hours(around 1-2 hrs) no data is getting.Check the bayeux client status and it shown as connected but the subscription is not happening.When we restart the service it's started working. Using below code for connection and subscription. Can any one please help on this.
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);
}
}