2015-01-20 3 views
0

웹 응용 프로그램에서 Asterisk AGI 요청을 수신하는 서버 소켓을 만들어야하지만 소켓에서 CDI 주입을 활성화해야합니다. 어떻게해야할지 모릅니다.CDI on Socket Wildfly 또는 SE

오늘이 소켓은 이미 잘 작동하고 있는데, 문제는 소켓에 CDI 빈을 주입 할 수 없다는 것입니다.

예 : 요청을 받아 풀에 보내

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를 작동시킬 수 없습니다. 우리가 이미 설립 한 것처럼

+2

개체를 '새로 만들 때'DI 마법이 자동으로 발생하지 않습니다. 객체 그래프는 DI 시스템에 의해 생성되어야합니다. –

+0

@MattBall, 내가 이것을 알고있는 이유는 내가 이것을하는 방법을 묻고 있는데, 왜냐하면 나 자신을 인스턴스화하는 것이 효과가 없을 것이기 때문이다. –

답변

2

, newnew 완전히 DI 시스템을 인하 이후 RequestProcessor@Inject -annotated 필드를 채울 수 없습니다 보내고. 그래서 당신은 그것을 가지고 할 수있는 방법이 필요하다. RequestProcessor는 DI가 제공하는 의존성 (phoneService) 및 프로그래밍 (socket)를 제공 하나를 원하기 때문에

당신의 목표는 특히 비 - 사소한 보인다. 일반적으로 DI를 사용하면 가능한 한 두 가지를 혼합하지 말 것을 권장합니다. DI를 사용하면 바이러스처럼 퍼지기를 원합니다. 그렇게 하죠. (거의) 모든 것이 주입되도록 시스템을 설계 할 수 있다면 은 정말 멋지다!

귀하의 상황은 완벽하게 실현 가능합니다.

잠재적 인 주사 부위에 어떤 방법이있는 것처럼 보입니다. 이는 기본적 것이다,

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 인스턴스를 생성하는 공장을 사용할 수 있습니다 :이 알 수없는 클래스는 CDI에 의해 만들어진 사실에 해당 클래스로 PhoneService@Inject 수 있으며, 다음 RequestProcessor 생성자에 전달된다고 가정 결국 같은 효과가있다.

public class RequestProcessorFactory { 
    @Inject 
    private PhoneService phoneService; 

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

다음 클래스에 그 공장의 인스턴스를 주입 : 당신은 꽤 친숙 할 것입니다 손으로이 공장 쓸 수 있습니다 당신이 그것을 할 수있는 세 번째 방법있다

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.과 유사합니다. 인터페이스를 제공하면 효과적으로 해당 팩토리 구현이 생성됩니다. 내 지식으로는 CDI가 이것을 지원하지 않지만 at least one CDI extension which does이 있습니다.

해피 DIING!

+0

오, 예, CDI가 잘 작동합니다. 문제는 소켓 안에 CDI Bean을 주입하는 것입니다. –

+0

문제를 더 잘 볼 수 있도록 퀘스트를 편집했습니다. –

+0

대답은 Thx입니다!나는 공장에서 옵션을 시도 할 것이다, 그런데, 만약 내가 프로그램 적으로 bean을 얻는다면? –