1

2 개의 EJB 응용 프로그램 A와 B가 있습니다. 응용 프로그램 B (Message Driven Bean)에 메시지를 보내는 비 상태 세션이 있습니다. App B가 앱 A에 메시지를 다시 보냅니다.메시지 리스너에서 값을 가져 와서 주 메뉴에서 인쇄합니다.

이제는 A의 상태 비 저장 세션빈에있는 메시지 수신기에서 원하는 값을 갖게되었습니다.하지만 Main에서 보여줄 필요가 있습니다. 나는 변수를 선언하고 그 안에 값을 저장하려고 시도했다. 그러나 Main에서 호출하면 값이 손실됩니다. 메인 클래스에서

@Stateful 
public class AManagerBean implements ejb.AManagerRemote { 
@Resource(mappedName = "jms/QueueConnectionFactory") 
private ConnectionFactory queueConnectionFactory; 
@Resource(mappedName = "jms/Queue") 
private Queue queue; 

private static int fineAmt; 

...... 

static class AListener implements MessageListener{ 
    public void onMessage(Message message){ 
     ..... 
     fineAmt = msg.getInt("fineAmt"); 
     // I NEED FINEAMT TO SHOW IN MAIN CLASS 

     ..... 
    } 
} 

public int returnFine(){ 
    return fineAmt; 
} 

...

public class Main { 

    @EJB 
    public static AManagerRemote amr; 

    public static void main(String[] args) { 
     ...... 
     System.out.println(amr.returnFine()); 
     // ALWAYS RETURN 0 

나는 fineamt는 메인 클래스에 표시해야합니다. 하지만 항상 null을 반환합니다.

어떻게해야합니까?

+0

일부 코드를 보지 않고 무엇을 하려는지 이해하기가 어렵습니다. 지금까지 가지고있는 코드를 보여줄 수 있습니까? – NilsH

+0

@NilsH이 (가) 내 게시물을 편집했습니다. – user1182637

+0

유스 케이스가 조금 이상하므로 테스트 용으로 만 사용한다고 가정합니다. 'onMessage'가 호출 된 것을 확인 했습니까? – NilsH

답변

1

실제 답변을 제공하지는 못했지만 의견을 제시하는 데 꽤 길기 때문에 답변으로 작성했습니다.

우선 EJB의 최종 정적 변수는 허용되지 않습니다. EJB Restrictionc FAQ

비정규 정적 클래스 필드는 엔터프라이즈 빈을 배포하기 어렵거나 불가능하게하기 때문에 EJB에서 허용되지 않습니다. 정적 클래스 필드는 특정 클래스의 모든 인스턴스간에 공유되지만 단일 JVM (Java Virtual Machine) 내에서만 공유됩니다. 정적 클래스 필드를 업데이트한다는 것은 클래스의 모든 인스턴스간에 필드의 값을 공유하려는 의도를 의미합니다. 그러나 클래스가 여러 JVM에서 동시에 실행되는 경우 업데이트 인스턴스와 동일한 JVM에서 실행되는 인스턴스 만 새 값에 액세스 할 수 있습니다. 즉, 비 정적 정적 클래스 필드는 여러 JVM에서 실행되는 것보다 단일 JVM에서 실행되는 경우 다르게 동작합니다. EJB 컨테이너는 Enterprise Bean을 여러 개의 JVM (동일한 서버 또는 서버 클러스터에서 실행 중)에 배포하는 옵션을 예약합니다. 비 정적 정적 클래스 필드는 엔터프라이즈 Bean 인스턴스가 분산되어 있는지 여부에 따라 다르게 동작하기 때문에 허용되지 않습니다.

둘째, Stateful 세션 bean을 정의했습니다. 상태 유지 세션 빈은 대화 상태를 가지고 있어야하고 클라이언트 (일반적으로)는 수명 기간 동안 동일한 상태 유지 빈을 처리합니다. 나는 당신의 예제에서 어떤 대화법도 볼 수 없다. (당신이 코드를 잘라 버렸기 때문에) 나는 정말로 stateful bean 일 필요가 있는가?

그래서 내가하는 첫 번째 일은 재 디자인을하고 실제 생활의 예를 만들고 실행하는 것입니다.