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();
            }
        }
Example #2
0
        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);
                    }
                }
            }
        }