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); } } }
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); } } }