전쟁, jar에 많은 서비스 콩이있는 코어 ejb 및 다른 jar의 원격 인터페이스로 구성된 응용 프로그램이 있습니다. 모든 것은 귀에 담아서 글래스 피쉬 4.1에서 실행됩니다.CDI 인스턴스 반복자를 사용하는 Java EE 플러그인 프레임 워크
이제 코어 ejb에 확장 지점 또는 플러그인 지원을 추가하려고합니다.
목표는 모두 동일한 인터페이스 ()를 공유하는 서로 다른 핫 플러그 가능한 데이터 가져 오기 서비스를 갖는 것입니다.이 서비스는 로이터 및 블룸버그와 같은 공급 업체의 재무 데이터를 가져와 정규화하기 때문입니다.
이러한 플러그인은 코어 ejb jar의 "Plugin Manager"bean에 의해 감지되고 관리되어야합니다. 플러그인은 런타임에로드, 언로드 및 바꾸기를 지원해야합니다.
이상적으로 플러그인 인터페이스는 별도의 패키지에 있으므로 내 응용 프로그램이나 Glassfish를 사용하지 않고 Java EE 스택없이 완벽하게 개발할 수 있습니다. 또한 항상 전체 응용 프로그램이 아닌 요구에 따라 플러그인을 배포하려고합니다.
현재 코어 ejb에있는 한 두 가지 가져 오기 서비스 구현에서 잘 작동하는 CDI 인스턴스 반복자를 사용하려고합니다. 하나의 구현을 별도의 ejb 항아리에 넣으면 CDI에서 찾을 수 없습니다. 문제는 Glassfish가 별도의 클래스 로더에서 각 ejb jar를 응용 프로그램으로로드한다는 것입니다.
이제 현재 간단한 코드가 제공됩니다.
별도의 항아리 패키지의 플러그인 인터페이스 :
package com.photon.extensions;
import java.io.Serializable;
public interface ImportServiceExtension extends Serializable {
String getImportServiceName();
}
발견되지 않는 별도의 EJB 항아리 패키지의 플러그인 구현 :
package com.photon.services.extensions.vitrex.services;
import com.photon.extensions.ImportServiceExtension;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Remote(ImportServiceExtension.class)
@Stateless
public class ReutersImportService implements ImportServiceExtension {
@Override
public String getImportServiceName() {
return "Reuters";
}
}
핵심 EJB 항아리에 플러그인 구현 발견 된 패키지 :
package com.photon.services.extensions;
import com.photon.extensions.ImportServiceExtension;
import javax.ejb.Stateless;
@Stateless
public class BloombergImportService implements ImportServiceExtension {
@Override
public String getImportServiceName() {
return "Bloomberg";
}
}
리모컨 원격 인터페이스 항아리에서 "플러그인 관리자"에 대한 인터페이스 :
package com.photon.services.extensions;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface ImportServiceExtensionsRemote {
List<String> getImportServiceNames();
}
코어 EJB 항아리에서 "플러그인 매니저"빈 구현 : (A)에 이름을 렌더링
package com.photon.services.extensions;
import com.photon.extensions.ImportServiceExtension;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.ejb.Stateless;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
@Stateless
public class ImportersService implements ImportServiceExtensionsRemote {
@Inject private Instance<ImportServiceExtension> importServiceExtensions;
@Override
public List<String> getImportServiceNames() {
Iterator<ImportServiceExtension> iter = importServiceExtensions.iterator();
List<String> names = new ArrayList<>();
while (iter.hasNext()) {
ImportServiceExtension extension = iter.next();
names.add(extension.getImportServiceName());
}
return names;
}
}
마지막 제어기 전쟁의 웹 사이트 :
package com.photon.website;
import com.photon.services.extensions.ImportServiceExtensionsRemote;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@RequestScoped
@Named
public class ImportController implements Serializable {
@EJB private ImportServiceExtensionsRemote importServiceExtensions;
public String getImportServiceNames() {
String names = "";
for (String name : importServiceExtensions.getImportServiceNames()) {
names += name;
}
return names;
}
}
"Bloomberg"만 렌더링됩니다. 이제
내 질문 :
는 내가 바른 길에 있습니까?
그렇다면 코드에 무엇이 누락 되었습니까?
이 문제 (OSGI, 사용자 정의 clazz.forName 등)에 대한 더 좋은 해결책이 있습니까?
감사합니다. 이 WildFly를 살펴 보겠습니다. – IUnknown