2017-01-31 2 views
0

내가 달성하고자하는 것은 EJB 기능을 활용하고 일종의 자동 풀링을 사용하는 것이다.Stateless EJB local (instance) 변수

로컬 상태 비 저장 변수 (적절한 정의인지 모르는 경우)을 유지할 때 SLSB가 적합 할 수 있다고 생각했습니다. 적어도 클라이언트/호출자 POV에서. 내가 프로세스의 풀을 원하는

@Stateless 
public class CommunicationService implements Serializable 
{ 
    private Process process; 

    @PostConstruct 
    //@PostActivate maybe? 
    public void startProcess() 
    { 
     try 
     { 
      process = new ProcessBuilder("running a temporary daemon").start(); 
     } 
     catch(IOException e) 
     { 
      throw new RuntimeException(e.getMessage(), e); 
     } 
    } 


    @PreDestroy 
    //@PrePassivate maybe? 
    public void endProcess() 
    { 
     if(process.isAlive()) 
     { 
      process.destroy(); 

      boolean terminated = false; 
      try 
      { 
       terminated = process.waitFor(5, TimeUnit.SECONDS); 
      } 
      catch(InterruptedException e) 
      { 
       // ignore 
      } 

      if(!terminated) 
      { 
       process.destroyForcibly(); 
      } 
     } 
    } 

    public int send(String message) 
    { 
     // do something with the process - may take a long time 
     // this is just an example 

     PrintStream printStream = new PrintStream(process.getOutputStream()); 
     printStream.println(message); 

     try 
     { 
      return process.getInputStream().read(); 
     } 
     catch(IOException e) 
     { 
      return -1; 
     } 
    } 
} 

주, 그래서 @Singleton들 적합하지 않습니다.

  1. @Stateless EJB 인스턴스 변수를 올바르게 사용하고 있습니까?
  2. @MessageDriven이 더 적절합니까?
  3. 더 있나요? EE 방법이 있습니까?

감사

+0

1) 상태가없는 EJB 상태를 제공하고 있기 때문에 1). 직업에 대한 잘못된 도구. 2) MDB는 대기열에 관련되어 있기 때문에 풀링이 아닙니다. 3) 나는 당신이 처음부터 풀이 필요한 이유를 정말로 이해하지 못하기 때문에 무엇에 대답해야할지 모르겠다.프로세스를 사용하여 문제를 해결하면서 어떤 문제를 해결할 것입니까? – Gimby

+0

** 1) ** 어떤 클라이언트 액세스가 처리되는지 상관하지 않습니다. * 상태 *로 간주 될지 모르겠습니다. ** 2) ** 당신 말이 맞아요. 일종의 비동기 대기열을 생각하고 있었지만, 적절하지는 않습니다. ** 3) ** 레거시 SW와의 통합. 제 경우에는 * jodconverter *를 다시 작성하기 때문에 일부 OpenOffice 인스턴스가 필요합니다. –

+0

그러면 더 좋아질 것입니다. 그런 다음 프로세스의 "풀"을 관리하는 싱글 톤 EJB가 실제로 필요합니다. 단순한 목록 일 수 있습니다. – Gimby

답변

2

, 그것은 SLSBs의 상태를 유지하는 것은 매우 괜찮아요 정보 나이 읽기. 단지 고객 상태 일 수 없습니다. EJB 3.2 스펙의 §4.7은 다음과 같이 말합니다 :

"stateless"라는 용어는 인스턴스에 특정 클라이언트에 대한 상태가 없음을 나타냅니다. 그러나 인스턴스의 인스턴스 변수에는 클라이언트가 호출 한 메소드 호출에 걸쳐 상태가 포함될 수 있습니다. 이러한 상태의 예로는 데이터베이스 연결 열기 및 엔터프라이즈 bean 오브젝트에 대한 오브젝트 참조가 있습니다.

  • 사양은 "무 상태 세션 빈 인스턴스가 는 일반적으로 풀링이다"라고 말한다 :

따라서,이 몇 가지주의와 가능한 전략이 될 수 있습니다. 당신은 선택된 JavaEE 서버 구현이 실제로 그것들을 풀 (pooling)하는지 점검 할 필요가있다. 왜냐하면 (적어도 잠시 동안) 그 중 일부는 매번 새로운 인스턴스를 생성하기 때문이다.

  • 풀의 빈 수를 제어하는 ​​것은 까다로운 작업 일 수 있습니다. 풀이 꽉 찬 경우에도 구현은 계속 빈 인스턴스를 생성 할 수 있으며 풀에 반환하지는 않습니다.

  • 비즈니스 메소드에서 임의의 유형의 RuntimeException이 발생하면 @PreDestroy 콜백 (EJB 3.2 스펙 9.3.1 참조)을 호출하지 않고도 Bean 인스턴스가 삭제됩니다. 이로 인해 시스템에서 프로세스 누수가 발생합니다.

  • 따라서 서버가 SLSB 풀을 관리하는 방식에 친숙해야합니다.

    +0

    현재 Wildfly 10을 사용하고 있습니다. SLSB를 관리하는 방법을 확인하겠습니다. 'RuntimeException' /'@ PreDestroy' 정보는 훌륭합니다! 이 놀라운 대답에 대해 대단히 감사합니다! –

    -1

    은 저를 위해, 당신은 팩토리 메소드 패턴를 구현해야;

    대중적인 신념에 반대 EJB Factory Class

    +0

    EJB 컨테이너를 구현하고 싶지 않고 어떻게 유용 할 수 있는지 이해하지 못합니다. 자동 풀 처리 또는 SLSB 인스턴스 변수와 어떻게 관련되어 있습니까? ? –

    +0

    기술에 관계없이 Factory 패턴을 처리하는 풀을 구현하는 것이 유용합니다. – bilelovitch

    관련 문제