public static void AddListener(Entitron.Entity.Nexus.RabbitMQ model) { if (listeners.ContainsKey(model.Name)) { listeners[model.Name].Channel.Close(); listeners[model.Name].Channel.Dispose(); listeners[model.Name].Connection.Close(); listeners[model.Name].Connection.Dispose(); listeners.Remove(model.Name); } RabbitMQListener listener = new RabbitMQListener() { Factory = new ConnectionFactory() { HostName = model.HostName, Port = model.Port } }; if (!string.IsNullOrEmpty(model.Password) && !string.IsNullOrEmpty(model.UserName)) { listener.Factory.UserName = model.UserName; listener.Factory.Password = model.Password; } try { listener.Connection = listener.Factory.CreateConnection(); listener.Channel = listener.Connection.CreateModel(); listener.Consumer = new EventingBasicConsumer(listener.Channel); listener.Consumer.Received += onNewMessage; listener.Channel.BasicConsume(model.QueueName, false, model.Name, listener.Consumer); listener.Channel.BasicQos(0, 1, false); listeners.Add(model.Name, listener); if (failedConnetionList.Contains(model)) { failedConnetionList.Remove(model); } } catch (Exception) { if (!failedConnetionList.Contains(model)) { failedConnetionList.Add(model); } } if (failedConnetionList.Count > 0 && !reconnectIntervalSet) { SetInterval(); } }
public RabbitMQService(Entitron.Entity.Nexus.RabbitMQ mq) { this.mq = mq; var factory = new ConnectionFactory() { HostName = mq.HostName, Port = mq.Port }; if (!string.IsNullOrEmpty(mq.UserName) && !string.IsNullOrEmpty(mq.Password)) { factory.UserName = mq.UserName; factory.Password = mq.Password; } connection = factory.CreateConnection(); channel = connection.CreateModel(); }
public static void onNewMessage(object model, BasicDeliverEventArgs args) { var body = args.Body; var message = Encoding.UTF8.GetString(body); var core = COREobject.i; DBEntities context = core.Context; Entitron.Entity.Nexus.RabbitMQ listener = context.RabbitMQs.Where(q => q.Name == args.ConsumerTag).FirstOrDefault(); if (listener != null) { Block block = GetBlockWithWF(context, listener.ApplicationId.Value, listener.BlockName.RemoveDiacritics()); if (block != null) { core.Application = listener.Application; try { PersonaAppRole role = context.AppRoles.FirstOrDefault(r => r.Name == "System" && r.ApplicationId == listener.ApplicationId); core.User = context.Users.FirstOrDefault(u => u.Users_Roles.Any(r => r.RoleName == role.Name && r.ApplicationId == role.ApplicationId)); OmniusInfo.Log($"Začátek zpracování RabbitMQ: {listener.Name} / Blok {listener.BlockName} / Button {listener.WorkflowName}", OmniusLogSource.Nexus, listener.Application, core.User); FormCollection fc = new FormCollection(); Dictionary <string, object> vars = new Dictionary <string, object>(); vars.Add("__RabbitMQMessage__", message); var runResult = new Modules.Tapestry.Tapestry(core).run(block, listener.WorkflowName, -1, fc, 0, null, vars); OmniusInfo.Log($"Konec zpracování RabbitMQ: {listener.Name} / Blok {listener.BlockName} / Button {listener.WorkflowName}", OmniusLogSource.Hermes, listener.Application, core.User); if (runResult.Item1.Errors.Count == 0) { listeners[args.ConsumerTag].Channel.BasicAck(args.DeliveryTag, false); } } catch (Exception e) { OmniusInfo.Log($"Chyba při zpracování RabbitMQ: {args.ConsumerTag} ({e})", OmniusLogSource.Nexus, null, null); } } } }