2011-11-03 37 views
7

Tôi đang cố gắng tìm ra lý do tại sao phương thức @Asynchronous trong EJB của tôi không thực sự được gọi không đồng bộ. Tôi đang chạy trên JBoss AS 7 bằng cách sử dụng CDI (với beans.xml) trong một dự án JSF2 với bao bì đơn giản .war được sản xuất bởi Maven.@ Không đồng bộ không dẫn đến việc gọi async không đồng bộ của phương thức EJB trong JBossAS7

EJB được đóng gói trong một chiến tranh cùng với các hạt được quản lý JSF2 tương tác với nó. Đó là một EJB đơn giản @Stateless. Nó được sử dụng bằng cách tiêm nó (thông qua @Inject) vào một bean được quản lý JSF2 gọi phương thức @Asynchronous của nó.

Thay vì lời gọi phương thức @Asynchronous trả về tương lai ngay lập tức, nó thực hiện đồng bộ như thể đó là cuộc gọi trực tiếp không được trả lời thông thường. Điều này đúng cho dù tôi sử dụng giao diện không có giao diện cục bộ hoặc giao diện doanh nghiệp địa phương để gọi EJB.

@Asynchronous chỉ được hỗ trợ cho @Remote beans? Nếu vậy, nó có thể hoạt động trong bao bì .war hoặc tôi có phải đóng gói một bình EJB trong một EAR chỉ để có được tính năng này không?

đang Giản vì dụ, với mỗi lớp trong cùng một gói trong một .WAR:

public interface SomeEJB { 
    public Future<Void> doSomething(); 
} 

@Stateless 
@Local(SomeEJB.class) 
public class SomeEJBImpl implements SomeEJB { 

    @Asynchronous 
    @Override 
    public Future<Void> doSomething() { 
    // Spend a while doing work 
    // then: 
    return new AsyncResult<Void>(null); 
    } 

} 

@Named 
@RequestScoped 
public class JSFBean { 

    @Inject private transient SomeEJB someEJB; 
    private Future<Void> progress; 

    // Called from JSF2, starts work and re-displays page 
    public String startWorkAction() { 
    // This call SHOULD return a Future immediately. Instead it blocks 
    // until doWork() completes. 
    progress = someEJB.doWork(); 
    } 

    public Boolean isDone() { 
    return progress != null && progress.isDone(); 
    } 

} 
+0

Bắt đầu giống như @Asynchronous không được triển khai trong JBoss AS 7 (như 7.0.2) - một lần nữa, các dấu hiệu triển khai Java EE 6 vẫn còn lỗi và không đầy đủ sau khi phát hành thông số kỹ thuật. Thở dài. Nó sẽ được tốt đẹp để phát hành một cảnh báo hoặc một cái gì đó không SILENTLY FAIL. –

+0

Bạn có thể bật một số tính năng EJB3.1 theo mặc định với cấu hình xem trước độc lập trong AS 7.0.2. Gọi là: "bin/standalone.sh --server-config = standalone-preview.xml" –

Trả lời

9

JBoss AS 7.0.2 không hỗ trợ @Asynchronous theo mặc định. Bạn phải bật nó lên. Nếu nó không được bật không có cảnh báo hoặc thông báo lỗi, các phương thức không đồng bộ chỉ được thực hiện đồng bộ.

Vâng, đó là người dùng thân thiện.

Để bật các tính năng trong sản phẩm này được cho là đã hoàn thành và phát hành *, bạn phải chạy JBoss AS 7.0.2 với "độc lập-preview.xml", ví dụ:

bin/standalone.sh --server-config=standalone-preview.xml 

hoặc trong AS 7.1 (beta) hoặc mới hơn:

bin/standalone.sh --server-config=standalone-full.xml 

... có các phương thức không đồng bộ được gọi ... không đồng bộ.

  • (Phải thừa nhận rằng AS 7 không yêu cầu Java EE 6 hồ sơ đầy đủ tuân thủ, nhưng một cảnh báo sẽ được tốt đẹp! Hoặc một số tài liệu trên được biết đến vấn đề/lỗ Bất cứ điều gì! Nhưng thất bại không có giấy tờ im lặng ...)

Cập nhật: Như đã lưu ý bởi garcia-jj, việc xóa lite=true khỏi standalone.xml cũng sẽ nhận được các EJB không đồng bộ hoạt động.

+0

Lưu ý rằng trong AS 7.1 "standalone-preview.xml" bây giờ là "standalone-full.xml" –

+0

Cách bật async EJB mà không cần sử dụng chế độ xem trước độc lập? Cảm ơn bạn. –

+0

@ garcia-jj Nó được gọi là standalone-full.xml trong các phiên bản mới hơn của JBoss AS 7, nhưng điểm giống nhau: Bạn phải chạy máy chủ với cấu hình hỗ trợ EJB không đồng bộ nếu bạn muốn sử dụng các EJB không đồng bộ. Nếu bạn không thích nó, hãy phàn nàn với JBoss, vì đó dường như là lựa chọn duy nhất bạn có ngay bây giờ. –

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