2012-01-31 5 views
6

tôi biết đậu stateful duy trì phiên đàm thoại giữa dụ khác nhau gọi phương thức, nhưng không quốc tịch câu hỏi sẽ not.My, giả sử tôi có một thi đậu quốc tịch như dưới đâySự khác nhau giữa quốc tịch và Stateful session bean

import javax.ejb.Stateful; 
import javax.ejb.Stateless; 

import com.tata.ejb3.data.HelloEJBInterface; 

@Stateless 
public class ValueEJB implements ValueEJBInterface{ 

    private int value; 
    @Override 
    public int getValue() { 
     return this.value; 
    } 

    @Override 
    public void setValue(int value) { 
     this.value = value; 
    } 
} 

Tôi có tôi đậu client (A servlet) mà khởi gọi đậu như sau

@EJB(mappedName="E/ValueEJB /remote") 
ValueEJBInterface value; 

.... 

value.setValue(250); 
System.out.println(value.getValue());//This statement prints the value 250 

.... 

Theo hiểu biết của tôi như đậu của tôi là đậu quốc tịch nó không nên hiển thị với giá trị 250.

012.

giá trị int cá nhân; là một biến tức thời, nếu một phương thức không trạng thái đặt giá trị của nó, giá trị sẽ hết hạn trên phương thức thoát. Nhưng ở đây, tôi có thể nhận được giá trị '250' ngay cả qua cuộc gọi phương thức thứ hai của mình. Có phải nó vi phạm khái niệm không quốc tịch? Tôi đang thiếu gì à?

Trả lời

2

Câu hỏi thú vị và về cơ bản bạn hoàn toàn đúng. Tôi đã làm một số nghiên cứu và lời khuyên chung là: "Mong đợi đậu của bạn để quên tất cả mọi thứ sau mỗi cuộc gọi phương pháp ..." (page 81). Hơn nữa, theo tài nguyên đó, thuật toán chịu trách nhiệm duy trì trạng thái của Session Session Statent là container/vendor cụ thể. Vì vậy, vùng chứa có thể chọn hủy, tạo lại hoặc xóa cá thể sau khi thực hiện phương thức.

Bạn có thể tạo thử nghiệm nhiều luồng và xem cách hoạt động của ứng dụng với các ứng dụng khách đa.

+0

Okay.You là right.If tôi không sai, kịch bản tương tự như cư xử khác nhau trong EJB2.0/WebLogic ejb container, nơi khách hàng EJB của tôi có 0 như getValue, phương tiện theo yêu cầu tiếp theo của tôi, container phục vụ với một trường hợp ejb khác. – ASChakkalakal

2

Không vi phạm bất kỳ khái niệm nào. Của nó bởi vì cùng một ví dụ của đậu được chọn bởi các container từ hồ bơi để phục vụ yêu cầu khác.

Hạt không quốc tịch được gộp chung & do đó chúng có lợi ích về hiệu suất trên các hạt đậu trạng thái, mục đích chính của chúng là xử lý mà không giữ bất kỳ trạng thái nào.

Dữ liệu nhạy cảm hoặc người dùng cụ thể không được lưu trữ trong các biến mẫu của các hạt không quốc tịch. Chúng nên được sử dụng rộng rãi để xử lý dữ liệu mà không cần xem xét bất kỳ trạng thái nào.

Có thể tham chiếu here cho các sự kiện vòng đời được xử lý bởi vùng chứa.

+0

Cảm ơn các chi tiết.Bạn có thêm câu hỏi tại đây. @stateless (mappedName = "XXX"), liệu ejb của tôi có được giới thiệu qua XXX tại đây không? Tôi đã thấy JBoss AS đưa ra một bản đồ JNDI khác biệt mặc dù XXX. Nó hoàn toàn là nhà cung cấp cụ thể? – ASChakkalakal

+0

Không, mappedName là thuộc tính tùy chọn và được để lại cho nhà cung cấp, JBoss sẽ loại bỏ thuộc tính này và sử dụng quy ước riêng của nó. –

+0

Tôi đã nhận thấy một điều thú vị hơn, mappedName chỉ được thực hiện khi giao diện dịch vụ của tôi là giao diện Từ xa. Khi tôi chỉ định mappedName cho EJB có giao diện dịch vụ được chú thích bằng @Local (hoặc thậm chí không được chỉ định ở đây), thùng chứa JBoss của tôi đã bỏ qua nó và ràng buộc với JNDI của riêng mình, somthing như xxxxx/Local – ASChakkalakal

5

Sự khác biệt giữa hành vi đậu trạng thái không trạng thái khi gọi các phương thức khác nhau.


STATEFUL: Khi gọi các phương thức khác nhau trên Bean trạng thái, các phiên bản bean khác được tạo.

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingStatefulThing(); 

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingNothingStatefulThing(); 

***Output: Note the creation of separate objects.*** 

INFO: Calling doingStatefulThing...com.myeclipseide.ejb3.stateful.**[email protected]** 

INFO: Calling doingNothingStatefulThing...com.myeclipseide.ejb3.stateful.**[email protected]** 

stateless: Khi gọi phương pháp khác nhau trên một quốc tịch Bean thì cà phê được gộp lại, do đó không có trường hợp mới của bean được tạo ra.

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doSomething(); 

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doNothing(); 

***Output: Note the reuse of he bean object.*** 

INFO: Doing something ...com.myeclipseide.ejb3.stateless.**[email protected]** 

INFO: Doing Nothing ...com.myeclipseide.ejb3.stateless.**[email protected]**