예제 #1
0
        public long Subscribe(ISubscribeRequest <TMessage> request, SubscribeOptions options, string topicUri)
        {
            lock (mLock)
            {
                WampRawTopic <TMessage> rawTopic;

                IWampCustomizedSubscriptionId customizedSubscriptionId =
                    mTopicContainer.GetSubscriptionId(topicUri, options);

                if (!mTopicUriToTopic.TryGetValue(customizedSubscriptionId, out rawTopic))
                {
                    rawTopic = CreateRawTopic(topicUri, options, customizedSubscriptionId);

                    IWampRegistrationSubscriptionToken subscriptionToken =
                        mTopicContainer.Subscribe(rawTopic, topicUri, options);

                    long subscriptionId =
                        subscriptionToken.TokenId;

                    mSubscriptionIdToTopic.TryAdd(subscriptionId, rawTopic);

                    rawTopic.SubscriptionId = subscriptionId;

                    rawTopic.SubscriptionDisposable = subscriptionToken;
                }

                rawTopic.Subscribe(request, options);

                return(rawTopic.SubscriptionId);
            }
        }
        public long Register(IRegisterRequest request, RegisterOptions options, string procedure)
        {
            WampCalleeRpcOperation <TMessage> operation =
                new WampCalleeRpcOperation <TMessage>(procedure,
                                                      request.Callee,
                                                      options,
                                                      mInvocationHandler,
                                                      this);

            try
            {
                IWampRegistrationSubscriptionToken token =
                    mCatalog.Register(operation, options);

                long registrationId = token.TokenId;

                operation.RegistrationId = registrationId;

                CompositeDisposable disposable = new CompositeDisposable(token, operation);

                bool alreadyRegistered =
                    !mOperationToDisposable.TryAdd(operation, disposable);

                request.Registered(registrationId);

                // If the operation is already registered, ignore it.
                if (!alreadyRegistered)
                {
                    operation.Open();
                }

                return(registrationId);
            }
            catch (Exception)
            {
                operation.Dispose();
                throw;
            }
        }
예제 #3
0
 public ForwardingToken(IWampRegistrationSubscriptionToken localToken, Task <IAsyncDisposable> remoteToken)
 {
     this._localToken = localToken;
     Task.Run(() => this.RegisterForwardingTokenAsync(remoteToken)).ConfigureAwait(false);
 }