private bool CreateSubscription(
double publishingInterval,
uint lifetimeCount,
uint keepAliveCount,
uint maxNotificationsPerPublish,
bool publishingEnabled,
byte priority)
{
try
{
uint subscriptionId;
double revisedPublishingInterval;
uint revisedLifetimeCount;
uint revisedKeepAliveCount;
Subscription subscription = new Subscription();
subscription.MaxNotificationsPerPublish = maxNotificationsPerPublish;
subscription.PublishingEnabled = publishingEnabled;
subscription.Priority = priority;
subscription.NextExpectedSequenceNumber = 1;
subscription.StaticData = true;
lock (m_subscriptions)
{
m_subscriptions.Add(subscription);
}
DateTime start = DateTime.UtcNow;
ResponseHeader responseHeader = Session.CreateSubscription(
null,
publishingInterval,
lifetimeCount,
keepAliveCount,
maxNotificationsPerPublish,
publishingEnabled,
priority,
out subscriptionId,
out revisedPublishingInterval,
out revisedLifetimeCount,
out revisedKeepAliveCount);
double elapsedTime = (DateTime.UtcNow - start).TotalMilliseconds;
if (elapsedTime > 300)
{
Log("WARNING: CreateSubscription took {0}ms. Timing errors may occur.", (DateTime.UtcNow - start).TotalMilliseconds);
}
subscription.SubscriptionId = subscriptionId;
subscription.PublishingInterval = revisedPublishingInterval;
subscription.LifetimeCount = revisedLifetimeCount;
subscription.KeepAliveCount = revisedKeepAliveCount;
while (m_outstandingPublishRequests < m_publishPipelineDepth)
{
BeginPublish();
}
lock (subscription)
{
PublishingState state = new PublishingState();
state.KeepAliveCount = subscription.KeepAliveCount;
state.PublishingInterval = subscription.PublishingInterval;
state.Start = responseHeader.Timestamp;
state.KeepAliveMode = true;
subscription.States.Add(state);
}
return true;
}
catch (Exception e)
{
Log(e, "Error creating subscription.", null);
return false;
}
}