Socket Wildfly 或 SE 上的 CDI

CDI on Socket Wildfly or SE

我需要在 Web 应用程序中创建一个服务器套接字来侦听 Asterisk AGI 请求,但我需要在套接字中启用 CDI 注入,不知道该怎么做。

今天我已经让这个套接字工作得很好,问题是我不能用套接字注入 CDI bean。

例如:

class RequestProcessor implements Runnable
{

private Socket socket;

@Inject
private PhoneService phoneService;

@Override
public void run()
{
  // Do the logic here
}
}

接收请求并发送到池的方法。

ExecutorService pool = Executors.newCachedThreadPool();

ServerSocket server = new ServerSocket(25000);

Socket client = server.accept();

pool.execute(new RequestProcessor(client));

这不是生产代码,它只是一个示例!

我无法让@Inject PhoneService phoneService 工作。

正如我们已经确定的那样,newing RequestProcessor 不会填充 @Inject-注释字段,因为 new 完全切断了 DI 系统。所以你需要一种方法来引入它。

您的目标看起来特别重要,因为 RequestProcessor 需要 DI 提供的依赖项 (phoneService) 您以编程方式提供的依赖项 (socket).作为一般规则,我建议尽可能不要将两者混合使用 - 一旦您使用 DI,它就会像病毒一样传播。让它发生吧。如果您可以设计您的系统,以便(几乎)一切都为您注入,那太棒了!

也就是说,你的情况是完全可行的。

看起来你在某些 class 中有一些方法,这是一个潜在的注射部位。假设这个未知的 class 实际上是由 CDI 创建的,您可以 @InjectPhoneService 放入 class,然后将其传递给 RequestProcessor 构造函数:

public class SomeClass {

  @Inject
  private PhoneService phoneService;

  private void someMethod() {
    ExecutorService pool = Executors.newCachedThreadPool();
    ServerSocket server = new ServerSocket(25000);
    Socket client = server.accept();
    pool.execute(new RequestProcessor(client, phoneService));
  }
}

或者你可以使用工厂创建RequestProcessor个实例,最终效果基本相同。你可以手写这个工厂,看起来很眼熟:

public class RequestProcessorFactory {
  @Inject
  private PhoneService phoneService;

  public RequestProcessor createNewProcessor(Socket socket) {
    return new RequestProcessor(socket, phoneService);
  }
}

然后将该工厂的一个实例注入您的 class:

public class SomeClass {

  @Inject
  private RequestProcessorFactory requestProcessorFactory;

  private void someMethod() {
    ExecutorService pool = Executors.newCachedThreadPool();
    ServerSocket server = new ServerSocket(25000);
    Socket client = server.accept();
    pool.execute(requestProcessorFactory.createNewProcessor(client));
  }
}

还有第三种方法,类似于 Guice's assisted injection. Effectively it just generates that factory implementation for you, if you provide the interface. To my knowledge, CDI does not support this, but there is at least one CDI extension which does

DI 快乐!