Esempio n. 1
0
        protected override void OnResponseMessageReceived(object sender, DuplexChannelMessageEventArgs e)
        {
            using (EneterTrace.Entering())
            {
                if (BrokerMessageReceived == null)
                {
                    EneterTrace.Warning(TracedObject + ErrorHandler.NobodySubscribedForMessage);
                    return;
                }

                BrokerMessageReceivedEventArgs anEvent = null;
                try
                {
                    BrokerMessage aMessage = mySerializer.ForResponseReceiver(e.ResponseReceiverId).Deserialize <BrokerMessage>(e.Message);
                    anEvent = new BrokerMessageReceivedEventArgs(aMessage.MessageTypes[0], aMessage.Message);
                }
                catch (Exception err)
                {
                    EneterTrace.Warning(TracedObject + "failed to deserialize the request message.", err);
                    anEvent = new BrokerMessageReceivedEventArgs(err);
                }

                try
                {
                    BrokerMessageReceived(this, anEvent);
                }
                catch (Exception err)
                {
                    EneterTrace.Warning(TracedObject + ErrorHandler.DetectedException, err);
                }
            }
        }
Esempio n. 2
0
        private void Publish(string publisherResponseReceiverId, BrokerMessage message, object originalSerializedMessage)
        {
            using (EneterTrace.Entering())
            {
                List <TSubscription> anIdetifiedSubscriptions = new List <TSubscription>();

                using (ThreadLock.Lock(mySubscribtions))
                {
                    foreach (TSubscription aMessageSubscription in mySubscribtions)
                    {
                        if ((myIsPublisherSelfnotified || aMessageSubscription.ReceiverId != publisherResponseReceiverId) &&
                            aMessageSubscription.MessageTypeId == message.MessageTypes[0])
                        {
                            anIdetifiedSubscriptions.Add(aMessageSubscription);
                        }
                    }
                }

                Dictionary <string, IEnumerable <string> > aFailedSubscribers = new Dictionary <string, IEnumerable <string> >();
                int aNumberOfSentSubscribers = 0;
                foreach (TSubscription aSubscription in anIdetifiedSubscriptions)
                {
                    if (aSubscription.ReceiverId == myLocalReceiverId)
                    {
                        if (BrokerMessageReceived != null)
                        {
                            try
                            {
                                BrokerMessageReceivedEventArgs anEvent = new BrokerMessageReceivedEventArgs(message.MessageTypes[0], message.Message);
                                BrokerMessageReceived(this, anEvent);
                            }
                            catch (Exception err)
                            {
                                EneterTrace.Warning(TracedObject + ErrorHandler.DetectedException, err);
                            }

                            ++aNumberOfSentSubscribers;
                        }
                    }
                    else
                    {
                        object aSerializedMessage = originalSerializedMessage;
                        if (aSerializedMessage == null)
                        {
                            try
                            {
                                ISerializer aSerializer = mySerializer.ForResponseReceiver(aSubscription.ReceiverId);
                                aSerializedMessage = aSerializer.Serialize <BrokerMessage>(message);
                            }
                            catch (Exception err)
                            {
                                EneterTrace.Error(TracedObject + "failed to serialize BrokerMessage using GetSerializeCallback.", err);
                            }
                        }

                        if (aSerializedMessage != null)
                        {
                            IEnumerable <string> anUnsubscribedMessagesDueToFailure = Send(aSubscription.ReceiverId, aSerializedMessage);
                            if (anUnsubscribedMessagesDueToFailure.Any())
                            {
                                aFailedSubscribers[aSubscription.ReceiverId] = anUnsubscribedMessagesDueToFailure;
                            }
                            else
                            {
                                ++aNumberOfSentSubscribers;
                            }
                        }
                    }
                }

                if (MessagePublished != null)
                {
                    PublishInfoEventArgs anEvent = new PublishInfoEventArgs(publisherResponseReceiverId, message.MessageTypes[0], message.Message, aNumberOfSentSubscribers);
                    try
                    {
                        MessagePublished(this, anEvent);
                    }
                    catch (Exception err)
                    {
                        EneterTrace.Warning(TracedObject + ErrorHandler.DetectedException, err);
                    }
                }

                // If sending to some subscribers failed then they were unsubscribed.
                foreach (KeyValuePair <string, IEnumerable <string> > aFailedSubscriber in aFailedSubscribers)
                {
                    RaiseClientUnsubscribed(aFailedSubscriber.Key, aFailedSubscriber.Value);
                }
            }
        }