Netty中如何使用外部服务?

How to use external services in Netty?

我刚刚开始使用 Netty 和两个外部服务实现一个 TCP 服务器:MongoDB 和 Redis。 由于这是我第一次接触 Netty,因此我需要一些建议。

我的疑问是,我是否应该为传入客户端之间的外部服务共享一个唯一的 class 实例?

例如: 关于Redis,我一般使用线程间共享的JedisPoolclass

 // Example
 // main class
public class Demo{
  public void demoClass(){
    JedisPool jedisPool = new JedisPool();
    for(int i = 0; i < 999; i ++){
       DemoThread thread = new DemoThread(jedisPool, i);
       thread.run();
    }
  }
}

// thread class
public class DemoThread{
  private JedisPool jedisPool;
  private int i;
  public DemoThread(JedisPool jedis, int i){
      this.jedisPool = jedis;
      this.i = i;
   }

   public void run(){
       Jedis redisClient = jedisPool.getResource();
       //...
   }
}

遵循几乎相同的示例,关于 MongoDB,我通常使用线程之间共享的 MongoDatabase class。

 // Example
 // main class
public class Demo{
  public void demoClass(){
    MongoClient mongoClient = new MongoClient();
    MongoDatabase mongoDatabase = mongoClient.getDatabase("example");
    for(int i = 0; i < 999; i ++){
       DemoThread thread = new DemoThread(mongoDatabase, i);
       thread.run();
    }
  }
}

// thread class
public class DemoThread{
  private MongoDatabase mongoDatabase;
  private int i;
  public DemoThread(MongoDatabase mongoDatabase, int i){
      this.mongoDatabase = mongoDatabase;
      this.i = i;
   }

   public void run(){
       MongoCollection collection = mongoDatabase.getCollection("example");
       //...
   }
}

在 Netty 中这样做是否正确?或者,在每个连接到服务器的新客户端上,我都必须创建到服务的新连接?

如果正确,那么我应该何时何地实例化 classes? 如果没有,那么我必须为每个客户端创建一个新连接?

非常感谢。

您可以通过创建实例并将其注入 ChannelHandler 来全局使用任何 class。