2017-07-05 18 views
5

Tôi có một lớp học mà trông như thế này:Một số trường hợp của một bean @Singleton OpenEJB hiện

@Singleton 
public class MySingletonImpl implements MySingleton{ 
    @Override 
    public void init(){ 
     ... 
    } 

    @Override 
    public void test(){ 
     ... 
    } 

} 

Nó được gọi là từ thử nghiệm ApplicationComposertestng mà trông như thế này:

@Listeners(ApplicationComposerListener.class) 
public class MyTest{ 
    @EJB 
    MySingleton mySingleton; 

    @Module 
    @Classes(cdi=true, value={MySingletonImpl.class}) 
    public EjbModule ejbModule() throws Exception{ 
      return new EjbModule(new EjbJar()); 
    } 

    @BeforeClass 
    public void setup(){ 
      mySingleton.init(); 
    } 

    @Test 
    public void test(){ 
      mySigleton.test(); 
    } 
} 

Vấn đề Tôi quan sát khi chạy thử nghiệm, là object id của trường hợp của MySingletonImpl lớp mà phương pháp test() được gọi là không giống như trường hợp mà phương thức init() được gọi.

Hành vi có vẻ lạ.

Trước tiên, vấn đề của tôi có thể được khắc phục như thế nào? Tôi muốn init và sau đó gọi các phương thức trên cùng một đối tượng, không phải các cá thể khác nhau của cùng một lớp.

Thứ hai, tại sao tất cả các container sẽ khởi tạo nhiều @Singleton s?

Trả lời

1

Giao diện của bạn có phải là @Remote hoặc cục bộ không? Nếu thay đổi @Local của nó để @Remote:

"đặc tả EJB không đảm bảo bất kỳ hành vi khi bạn sử dụng các giao diện doanh nghiệp địa phương cho liên module truyền thông ngay cả khi những mô-đun này là một phần của cùng một ứng dụng Máy chủ/JVM. "

https://coderanch.com/mobile/t/608212/java/instances-Singleton-EJB

+0

Tôi cho rằng ứng dụng của tôi không có tính năng thông tin liên lạc giữa các mô-đun, mặc dù tôi là một chút nhầm lẫn như những gì được coi là một "mô-đun". Khi thử nghiệm, ApplicationComposer được cho là tạo ra một mô-đun duy nhất, như được gợi ý bởi chú thích Module. Khi chạy, ứng dụng được triển khai như một cuộc chiến tranh duy nhất có một tệp web.xml, với một vài lọ, mỗi cái có bộ mô tả beans.xml của nó. Theo như tôi có thể nói, nó được coi là một "mô-đun". Tôi muốn tránh làm cho giao diện từ xa, để ngăn chặn hình phạt serialization-deserialization và biến chứng. Cảm ơn. – alex440

Các vấn đề liên quan