1 module hunt.framework.provider.RedisServiceProvider;
2 
3 import hunt.framework.provider.ServiceProvider;
4 import hunt.framework.config.ApplicationConfig;
5 
6 import hunt.collection.HashSet;
7 import hunt.collection.Set;
8 import hunt.logging.ConsoleLogger;
9 import hunt.redis;
10 import poodinis;
11 
12 import std.conv;
13 import std.string;
14 
15 /**
16  * 
17  */
18 class RedisServiceProvider : ServiceProvider {
19 
20     override void register() {
21         // container.register!(RedisPoolConfig)().singleInstance();
22 
23         container.register!(RedisPool)(() {
24             ApplicationConfig config = container.resolve!ApplicationConfig();
25 
26             auto redisOptions = config.redis;
27             auto redisPoolOptions = redisOptions.pool;
28 
29             if (redisOptions.enabled) {
30                 RedisPoolConfig poolConfig = new RedisPoolConfig();
31                 poolConfig.host = redisOptions.host;
32                 poolConfig.port = cast(int) redisOptions.port;
33                 poolConfig.password = redisOptions.password;
34                 poolConfig.database = cast(int) redisOptions.database;
35                 poolConfig.soTimeout = cast(int) redisPoolOptions.idleTimeout;
36                 poolConfig.connectionTimeout =  redisOptions.timeout;
37                 poolConfig.setMaxTotal(redisPoolOptions.maxPoolSize);
38                 poolConfig.setBlockWhenExhausted(redisPoolOptions.blockOnExhausted);
39                 poolConfig.setMaxWaitMillis(redisPoolOptions.waitTimeout);
40 
41                 infof("Initializing RedisPool: %s", poolConfig.toString());
42 
43                 return new RedisPool(poolConfig); 
44             } else {
45                 // warning("RedisPool has been disabled.");
46                 // return new RedisPool();
47                 throw new Exception("The Redis is disabled.");
48             }
49         }).singleInstance();
50 
51         container.register!(RedisCluster)(() {
52             ApplicationConfig config = container.resolve!ApplicationConfig();
53 
54             auto redisOptions = config.redis;
55             auto redisPoolOptions = redisOptions.pool;
56             auto clusterOptions = config.redis.cluster;
57 
58             if(clusterOptions.enabled) {
59 
60                 RedisPoolConfig poolConfig = new RedisPoolConfig();
61                 poolConfig.host = redisOptions.host;
62                 poolConfig.port = cast(int) redisOptions.port;
63                 poolConfig.password = redisOptions.password;
64                 poolConfig.database = cast(int) redisOptions.database;
65                 poolConfig.soTimeout = cast(int) redisOptions.timeout;
66                 poolConfig.connectionTimeout =  redisOptions.timeout;
67                 poolConfig.setMaxTotal(redisPoolOptions.maxPoolSize);
68                 poolConfig.setBlockWhenExhausted(redisPoolOptions.blockOnExhausted);
69                 poolConfig.setMaxWaitMillis(redisPoolOptions.waitTimeout);
70 
71                 infof("Initializing RedisCluster: %s", poolConfig.toString());  
72 
73                 string[] hostPorts = clusterOptions.nodes;
74                 Set!(HostAndPort) clusterNode = new HashSet!(HostAndPort)();
75                 foreach(string item; hostPorts) {
76                     string[] hostPort = item.split(":");
77                     if(hostPort.length < 2) {
78                         warningf("Wrong host and port: %s", item);
79                         continue;
80                     }
81 
82                     version(HUNT_DEBUG) {
83                         tracef("Cluster host: %s", hostPort);
84                     }
85 
86                     try {
87                         int port = to!int(hostPort[1]);
88                         clusterNode.add(new HostAndPort(hostPort[0], port));
89                     } catch(Exception ex) {
90                         warning(ex);
91                     }
92                 }
93 
94                 RedisCluster jc = new RedisCluster(clusterNode, redisOptions.timeout, redisOptions.timeout,
95                         clusterOptions.redirections, redisOptions.password, poolConfig);
96 
97                 return jc;
98 
99             } else {
100                 throw new Exception("The RedisCluster is disabled.");
101             }
102 
103         // }).newInstance();
104         }).singleInstance();
105     }
106 }