Beispiel #1
0
        /// <summary>
        /// Creates a subscription that can be used to recieve data change or event notifications. 
        /// </summary>
        public CreateSubscriptionResponseMessage CreateSubscription(CreateSubscriptionMessage request)
        {
            try
            {
                lock (m_lock)
                {
                    // verify the session.
                    Session session = VerifySession(request.RequestHeader, false);

                    // create a new subscription.
                    Subscription subscription = new Subscription();

                    uint subscriptionId;
                    double publishingInterval;
                    uint lifetimeCount;
                    uint keepAliveCount;

                    // the subscription validates the parameters and throws exceptions on error.
                    subscription.Create(
                        session,
                        m_nodeManager,
                        request.RequestedPublishingInterval,
                        request.RequestedLifetimeCount,
                        request.RequestedMaxKeepAliveCount,
                        request.MaxNotificationsPerPublish,
                        request.PublishingEnabled,
                        request.Priority,
                        out subscriptionId,
                        out publishingInterval,
                        out lifetimeCount,
                        out keepAliveCount);

                    // save the subscription.
                    m_subscriptions.Add(subscriptionId, subscription);

                    // start the publish thread if it has not already been started.
                    if (m_subscriptions.Count == 1)
                    {
                        ThreadPool.QueueUserWorkItem(PublishSubscriptions);
                    }

                    // return the response.
                    CreateSubscriptionResponseMessage response = new CreateSubscriptionResponseMessage();

                    response.ResponseHeader = CreateResponseHeader(request.RequestHeader);
                    response.SubscriptionId = subscriptionId;
                    response.RevisedPublishingInterval = publishingInterval;
                    response.RevisedLifetimeCount = lifetimeCount;
                    response.RevisedMaxKeepAliveCount = keepAliveCount;

                    return response;
                }
            }
            catch (Exception e)
            {
                throw CreateSoapFault(request.RequestHeader, e);
            }
        }