/// <summary> /// Subscribes for messages from other instance Flexberry Service Bus. /// Clones message types and updates subscriptions in all remote instance Flexberry Service Bus. /// </summary> /// <param name="cloneMessageTypes">Clone all message types from remote instance Flexberry Service Bus.</param> private void Subscribe(bool cloneMessageTypes) { foreach (Bus serviceBus in _repository.GetAllServiceBuses()) { try { _logger.LogDebugMessage(nameof(CrossBusCommunicationService), $"Working with remote SB '{serviceBus.Name ?? "<noname>"}' ({serviceBus.ManagerAddress})."); var client = new ChannelFactory <IServiceBusInterop>(new BasicHttpBinding()).CreateChannel(new EndpointAddress(serviceBus.ManagerAddress)); if (client == null) { throw new InvalidOperationException($"Unable to create WCF client to the SB ({serviceBus.ManagerAddress})."); } if (cloneMessageTypes) { NameCommentStruct[] msgTypes = client.GetMsgTypesFromBus(ServiceID4SB); _logger.LogDebugMessage(nameof(CrossBusCommunicationService), $"Loaded {msgTypes.Length} message types from remote SB '{serviceBus.Name ?? "<noname>"}'."); foreach (NameCommentStruct type in msgTypes.Where(type => _repository.GetAllMessageTypes().All(t => t.ID != type.Id))) { _logger.LogDebugMessage(nameof(CrossBusCommunicationService), $"Cloning message type {type.Id} ({type.Name})."); ServiceBusMessageType newType = new ServiceBusMessageType { Name = type.Name, Description = type.Comment, ID = type.Id }; _subscriptionsManager.CreateMessageType(newType); } } else { client.UpdateClientSubscribesForMsgs(ServiceID4SB); } } catch (Exception e) { _logger.LogUnhandledException(e, title: nameof(CrossBusCommunicationService)); } } }