2016-09-01 4 views
1

전쟁, 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"만 렌더링됩니다. 이제

내 질문 :

  1. 는 내가 바른 길에 있습니까?

  2. 그렇다면 코드에 무엇이 누락 되었습니까?

  3. 이 문제 (OSGI, 사용자 정의 clazz.forName 등)에 대한 더 좋은 해결책이 있습니까?

답변

1

내가 당신에게 완전한 대답을하지만, 여기에 생각을위한 음식입니다 수 없습니다 ...

나는 문제가 같아요 글래스 피시로드 별도의 클래스 로더에 응용 프로그램으로 각 EJB 항아리입니다.

당신이 그것을 못 박았습니다. 슬프게도 이것은 (JEE 사양)이므로 예상되는 동작입니다.

글래스 피 (Glassfish)에 대해 모르겠지만 배포 사이에 클래스 로더를 공유 할 수있는 기능이있을 수 있습니다 (배포 격리라고하는 Wildfly에는 일부 기능이 있음). 문제가 해결 될 수도 있습니다.

내가 Wildfly로부터 알 수있는 다른 것 중 하나는 서버 모듈으로 배포 된 일부 응용 프로그램을 다른 모든 배포 (및 해당 클래스 로더)에 액세스 할 수 있다는 것입니다. 글래스 피쉬에서 비슷한 것이 있다면, 시도해 볼 수 있습니다. Wildfly에 기회를주기 원할 경우, here 링크를 통해 문제를 논의 할 수 있습니다.

이제보기의 CDI 지점에서 이 문제는 또한 정확하고 다른 배포에서 클래스 로더에 액세스 할 수 없기 때문에 당신이이 있다면 나는 (당신이 그것을 바꿀 수있는 방법이 없다 두렵다 , 주어진 배치에 대해 BeanManager을로드하고 관련 bean을 검색 할 수 있습니다).

최소한의 통찰력을 제공하시기 바랍니다.

+0

감사합니다. 이 WildFly를 살펴 보겠습니다. – IUnknown

관련 문제