/// <summary>
        /// Create a factory for generating tenant queues
        /// </summary>
        /// <param name="queuePrefix">The prefix to use for the queue in Redis</param>
        public RedisTenantQueueFactory(string queuePrefix)
        {
            _queuePrefix = queuePrefix;

            _redisManager = new RedisManager();
            _redisManager.Connect();
        }
        public void TestSync( )
        {
            const string channelName = "myChannel";

            using (var domain1 = new TestAppDomain( ))
            {
                Func <MessageEventArgs <TestMessage>, bool> predicate = m => m.Message.Action == "myMessage";

                var instance1 = domain1.InjectType <SubscriberRefObject <TestMessage> >(channelName, RunAsDefaultTenant.DefaultTenantName, predicate);

                using (IDistributedMemoryManager manager = new RedisManager( ))
                {
                    manager.Connect( );

                    const int count = 1000;

                    using (IChannel <TestMessage> channel = manager.GetChannel <TestMessage>(channelName))
                    {
                        RunSync(channel, count);

                        instance1.MessageReceived.WaitOne(DefaultTimeout);

                        Assert.Greater(instance1.ReceivedMessages.Count, 0);
                    }
                }
            }
        }
        public void TestSubscriber( )
        {
            const string channelName = "myChannel";

            using (var domain1 = new TestAppDomain( ))
            {
                Func <MessageEventArgs <TestMessage>, bool> predicate = m => m.Message.Action == "myMessage";

                var instance1 = domain1.InjectType <SubscriberRefObject <TestMessage> >(channelName, RunAsDefaultTenant.DefaultTenantName, predicate);

                using (var domain2 = new TestAppDomain( ))
                {
                    var instance2 = domain2.InjectType <SubscriberRefObject <TestMessage> >(channelName, RunAsDefaultTenant.DefaultTenantName, predicate);

                    using (IDistributedMemoryManager manager = new RedisManager( ))
                    {
                        manager.Connect( );

                        using (IChannel <TestMessage> channel = manager.GetChannel <TestMessage>(channelName))
                        {
                            var message = new TestMessage( );
                            message.Action = "myMessage";

                            channel.Publish(message);

                            bool waitOne1 = instance1.MessageReceived.WaitOne(DefaultTimeout);
                            bool waitOne2 = instance2.MessageReceived.WaitOne(DefaultTimeout);

                            Assert.IsTrue(waitOne1, "No message received in " + DefaultTimeout + "ms for app domain 1.");
                            Assert.IsTrue(waitOne2, "No message received in " + DefaultTimeout + "ms for app domain 2.");

                            instance2.Unsubscribe( );

                            channel.Publish(message);

                            waitOne1 = instance1.MessageReceived.WaitOne(DefaultTimeout);
                            waitOne2 = instance2.MessageReceived.WaitOne(0);

                            Assert.IsTrue(waitOne1, "No message received in " + DefaultTimeout + "ms for app domain 1.");
                            Assert.IsFalse(waitOne2, "Message received in app domain 1 when it should not have been.");

                            instance1.Unsubscribe( );

                            var channelMessage = new TestMessage( );

                            channel.Publish(channelMessage);

                            waitOne1 = instance1.MessageReceived.WaitOne(0);
                            waitOne2 = instance2.MessageReceived.WaitOne(0);

                            Assert.IsFalse(waitOne1, "Message received in app domain 1 when it should not have been.");
                            Assert.IsFalse(waitOne2, "Message received in app domain 2 when it should not have been.");
                        }
                    }
                }
            }
        }
Example #4
0
 public static IServiceCollection AddRedis(this IServiceCollection services,
                                           IConfiguration configuration,
                                           out ConnectionMultiplexer redisConn,
                                           out string redisConnectionString)
 {
     redisConn = RedisManager.Connect(configuration.GetSection("redis"), out redisConnectionString);
     services.AddSingleton(redisConn);
     return(services);
 }
        public static IServiceCollection AddCnblogsAuthentication(
            this IServiceCollection services,
            IConfigurationSection redisConfiguration,
            Action <CookieAuthenticationOptions> configureOption = null)
        {
            var redisConn = RedisManager.Connect(redisConfiguration, out var redisConnectionString);

            return(services.AddCnblogsAuthentication(redisConn, redisConnectionString, configureOption));
        }
        public void TestBulkPublisher( )
        {
            const string channelName = "myChannel";

            using (var domain = new TestAppDomain( ))
            {
                Func <MessageEventArgs <TestMessage>, bool> predicate = m => m.Message.Action == PublisherActions.Remove && m.Message.Items.Count == 2 && m.Message.Items.Contains("a,:") && m.Message.Items.Contains("b,:");

                var instance = domain.InjectType <SubscriberRefObject <TestMessage> >(channelName, RunAsDefaultTenant.DefaultTenantName, predicate);

                using (IDistributedMemoryManager manager = new RedisManager( ))
                {
                    manager.Connect( );

                    using (DeferredChannelMessageContext context = new DeferredChannelMessageContext())
                    {
                        using (IChannel <TestMessage> channel1 = manager.GetChannel <TestMessage>(channelName))
                        {
                            var message1 = new TestMessage
                            {
                                Action = PublisherActions.Remove
                            };

                            message1.Items.Add("a,:");

                            channel1.Publish(message1, PublishOptions.None, false, (e, n) => e.Items.AddRange(n.Items));

                            using (IChannel <TestMessage> channel2 = manager.GetChannel <TestMessage>(channelName))
                            {
                                var message2 = new TestMessage
                                {
                                    Action = PublisherActions.Remove
                                };

                                message2.Items.Add("b,:");

                                channel2.Publish(message2, PublishOptions.None, false, (e, n) => e.Items.AddRange(n.Items));
                            }
                        }
                    }

                    bool waitOne = instance.MessageReceived.WaitOne(DefaultTimeout);

                    Assert.IsTrue(waitOne, "No message received in " + DefaultTimeout + "ms.");

                    Assert.GreaterOrEqual(instance.ReceivedMessages.Count, 1, "Received message count is invalid.");

                    MessageEventArgs <TestMessage> args = instance.ReceivedMessages.FirstOrDefault(predicate);

                    Assert.IsNotNull(args, "Received message is invalid.");
                }
            }
        }
Example #7
0
        /// <summary>
        /// Loads the registrations.
        /// </summary>
        /// <param name="builder">The container builder.</param>
        protected override void Load(ContainerBuilder builder)
        {
            builder.Register(cc =>
            {
                RedisManager redisManager = new RedisManager();
                redisManager.Connect();
                return(redisManager);
            })
            .As <IDistributedMemoryManager>()
            .SingleInstance();

            builder.RegisterType <TaskManager>().As <ITaskManager>().SingleInstance();
        }
        public void TestConnect( )
        {
            using (var manager = new RedisManager( ))
            {
                bool isConnected = manager.IsConnected;

                Assert.IsFalse(isConnected, "New redis manager should start disconnected.");

                manager.Connect( );

                isConnected = manager.IsConnected;

                Assert.IsTrue(isConnected, "Failed to connect to redis.");
            }
        }
Example #9
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplicationInsightsTelemetry();
            services.AddHttpContextAccessor();
            services.AddControllersWithViews().AddFluentValidation();
            services.Configure <FileUploadSettings>(Configuration.GetSection("FileUploadSettings"));
            services.AddValidationInjection();
            services.AddDbContext <MatmazelContext>(option => option.UseNpgsql("Server=167.172.186.80; Database=perdecim; User Id=perdecimuser; Password=H}WuON<QXIIGfX; Port=5432;"));
            services.AddIdentity <AppUser, AppRole>(_ =>
            {
                _.Password.RequiredLength         = 5;
                _.Password.RequireNonAlphanumeric = false;
                _.Password.RequireLowercase       = false;
                _.Password.RequireUppercase       = false;

                _.User.RequireUniqueEmail        = true;
                _.User.AllowedUserNameCharacters = "abcçdefghiıjklmnoöpqrsştuüvwxyzABCÇDEFGHIİJKLMNOÖPQRSŞTUÜVWXYZ0123456789-._@+";
            }).AddEntityFrameworkStores <MatmazelContext>()
            .AddDefaultTokenProviders();
            services.AddScoped <IUserClaimsPrincipalFactory <AppUser>, MyUserClaimsPrincipalFactory>();
            services.ConfigureApplicationCookie(_ =>
            {
                _.LoginPath  = new PathString("/Auth/Login");
                _.LogoutPath = new PathString("/Auth/Logout");
                _.Cookie     = new CookieBuilder
                {
                    Name         = "AccessToken",
                    HttpOnly     = false,
                    SameSite     = SameSiteMode.Lax,
                    SecurePolicy = CookieSecurePolicy.Always
                };
                _.SlidingExpiration = true;
                _.ExpireTimeSpan    = TimeSpan.FromHours(3);
            });
            services.AddSignalR();
            services.Configure <RedisSettings>(Configuration.GetSection("RedisSettings"));
            services.AddSingleton <RedisManager>(sp =>
            {
                RedisSettings redisSettings = sp.GetRequiredService <IOptions <RedisSettings> >().Value;
                RedisManager redis          = new RedisManager(redisSettings.Host, redisSettings.Port);
                redis.Connect();
                return(redis);
            });
        }
Example #10
0
        /// <param name="channelName">Name of the channel.</param>
        /// <param name="tenantName">Name of the tenant.</param>
        /// <param name="filter">The filter.</param>
        public SubscriberRefObject(string channelName, string tenantName, Func <MessageEventArgs <T>, bool> filter)
        {
            Context = new TenantAdministratorContext(tenantName);

            Filter = filter;

            Manager = new RedisManager( );
            Manager.Connect( );

            ReceivedMessages = new List <MessageEventArgs <T> >( );
            MessageReceived  = new AutoResetEvent(false);

            Channel = Manager.GetChannel <T>(channelName);

            Channel.MessageReceived += Handler;
            Channel.Subscribe( );

            /////
            // Allow time for the server to receive the message and process it.
            /////
            Thread.Sleep(1000);
        }
        public void TestReconnect( )
        {
            using (var manager = new RedisManager( ))
            {
                bool isConnected = manager.IsConnected;

                Assert.IsFalse(isConnected, "New redis manager should start disconnected.");

                manager.Connect( );

                isConnected = manager.IsConnected;

                Assert.IsTrue(isConnected, "Failed to connect to redis.");

                ServiceHelper.StopService( );

                isConnected = manager.IsConnected;

                Assert.IsFalse(isConnected, "Failed to automatically disconnect when redis shutdown.");

                ServiceHelper.StartService( );

                int retries = 0;

                while (retries < 5 && !isConnected)
                {
                    isConnected = manager.IsConnected;

                    if (!isConnected)
                    {
                        Thread.Sleep(1000);
                        retries++;
                    }
                }

                Assert.IsTrue(isConnected, "Failed to automatically reconnect when redis started back up.");
            }
        }