2012-02-24 11 views
5

Chúng tôi có một ứng dụng web sử dụng các công nghệ sau: JSF 2.0, EJB 3.1, JPA 2.0, JBoss AS 7.1 cuối cùngentry cache không sử dụng

Đôi khi chúng tôi nhận được ngoại lệ sau đây ra khỏi hư không:

09:46:29,664 ERROR [org.jboss.ejb3.invocation] (http-10.99.0.10-10.99.0.10-8080-14) JBAS014134: EJB Invocation failed on component VehicleServiceBean for method public abstract java.util.List com.hji.common.service.VehicleService.findVehiclesBySearchCriteriaAndImporterIds(com.hji.common.domain.repository.VehicleRepository$VehicleSearchCriteria,java.lang.String,java.util.List,boolean): java.lang.IllegalStateException: JBAS014531: Cache entry {[36, -111, 
-104, -128, 61, -17, 73, 29, -101, 52, -7, -106, 46, -3, 44, -22]} is not in use 
      at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:134) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final] 
      at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:56) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final] 
      at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:76) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final] 
      at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:39) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final] 
      at org.jboss.as.ejb3.component.stateful.StatefulSessionSynchronizationInterceptor.releaseInstance(StatefulSessionSynchronizationInterceptor.java:197) ... 
**Caused by: java.lang.IllegalStateException: JBAS014531: Cache entry {[36, -111, -104, -128, 61, -17, 73, 29, -101, 52, -7, -106, 46, -3, 44, -22]} is not in use** 
      at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:134) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final] 
      at org.jboss.as.ejb3.cache.impl.backing.NonPassivatingBackingCacheImpl.release(NonPassivatingBackingCacheImpl.java:56) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final] 
      at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:76) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final] 
      at org.jboss.as.ejb3.cache.spi.impl.AbstractCache.release(AbstractCache.java:39) [jboss-as-ejb3-7.1.0.Final.jar:7.1.0.Final] ... 

Tôi đã tìm kiếm trên web một thời gian nhưng không thể tìm thấy giải pháp nào. Có ai biết loại lỗi này không?

Trả lời

3

Tôi đã tìm kiếm xung quanh vì tôi gặp sự cố tương tự. Tôi đã chỉ tìm thấy hai giải thích có thể: hoặc đậu trạng thái của bạn đã hết thời gian chờ (mặc định là 5000 giây trên AS7.1), hoặc bạn đang chuyển một tham chiếu tới SFSB từ một luồng này tới luồng khác - cái nào (nó được đề xuất trên the jboss forum không được phép, nếu trước đây, hoặc tăng thời gian chờ hoặc bắt ngoại lệ.Nếu sau này, có jboss tiêm đậu trạng thái bất cứ nơi nào nó cần thiết hơn là vượt qua nó xung quanh. Tôi không có một trong số đó cho tôi. Tôi chỉ có một bean trạng thái trong thiết lập thử nghiệm, được tiêm riêng biệt vào các bean không trạng thái khác nhau - và tôi có thể tạo ra ngoại lệ trong vòng vài giây sau khi chạy thử nghiệm. để theo dõi xuống nơi tôi đang đi sai - nếu bạn đã tìm thấy giải pháp thay thế cho vấn đề của mình, bạn có thể đăng giải pháp đó không?

Rgds, James

Tôi đã thu hẹp quyền truy cập đồng thời - tôi có thể thực hiện nhiều yêu cầu tuần tự, nhưng chỉ một vài yêu cầu "đồng thời" trước khi điều này xảy ra. (Tôi đặt đồng thời trong dấu ngoặc kép vì tôi đồng bộ hóa trên một khóa được tổ chức bởi eS @SessionScoped để chỉ có thể gọi đồng thời là phương thức getLock() mà tôi đã tạo trên đó).

Tôi hoàn toàn bối rối về việc liệu Weld có cho phép hoặc ngăn truy cập đồng thời vào @SessionScoped @Stateful EJBs hay không. Tôi đọc rằng Seam serializes truy cập (và Weld được sinh ra từ Seam) nhưng không biết liệu đó có phải là trường hợp hay không. Nếu có, thì cái gì khác đang khiến hạt đậu của tôi chết. Nó dễ dàng tái tạo thông qua truy cập đồng thời từ các bean @Stateless riêng biệt.

+0

Có bạn đã đúng.Chúng tôi đã đi đến kết luận tương tự và tái cấu trúc một số phương pháp của chúng tôi để một bean phiên không được gọi nhiều hơn một lần. Hơn nữa, chúng tôi bây giờ tắt các nút sau khi người dùng nhấn nút để ngăn các cuộc gọi đồng thời. – Primi

0

Ok tôi có thể cung cấp những gì tôi nghĩ là một câu trả lời chính xác hơn bây giờ. Tôi đã không thể từ bỏ việc cho phép truy cập đồng thời vào ejb trạng thái vì ứng dụng của tôi sử dụng ajax, vì vậy các cuộc gọi đồng thời là không thể tránh khỏi. Tôi không thể nhớ nơi tôi tìm thấy tài liệu tham khảo, nhưng tôi hiểu rằng truy cập đồng thời vào một bean stateful nên được serialized bởi container dưới EJB3.1 - vì vậy tôi nên có được tốt.

Tôi đã cố gắng theo dõi theo cách của mình thông qua nguồn JBoss AS7 và nghĩ rằng tôi đã tìm thấy sự cố (hiện đang được thảo luận tại đây on the jboss AS7 forum). Nó dường như là một lỗi - jboss chỉ đồng bộ hóa truy cập nếu cuộc gọi của bạn nằm trong một giao dịch hoạt động (BMT hoặc CMT). Nếu không, đồng bộ hóa không thành công - và không thể (theo như tôi có thể tìm) để đồng bộ hóa hoặc khóa chính bạn, bởi vì bạn chỉ nhận được quyền truy cập vào proxy cho bean chứ không phải bản thân cơ sở. Đồng bộ hóa trên proxy là vô ích đối với bất kỳ điều gì khác ngoài (các) chủ đề mà proxy tồn tại.

Cách giải quyết hiện tại là đảm bảo tất cả các cuộc gọi có thể đồng thời được bao bọc trong giao dịch. Tôi đã ngạc nhiên khi thấy rằng chi phí hoạt động của việc mở và đóng một giao dịch thường xuyên trên một EXTERTED PersistenceContext là rất nhỏ - nhưng tôi đã không thực sự đẩy nó rất khó :)

Tôi nghi ngờ vấn đề ảnh hưởng đến tất cả các phiên bản AS7 , nhưng chỉ xác nhận nó trên AS7.1.

+0

Trong trường hợp của chúng tôi, chúng tôi có rất nhiều phương pháp được chú thích bằng @TransactionAttribute (TransactionAttributeType.NOT_SUPPORTED). Vì vậy, nếu tôi hiểu chính xác, việc thay đổi loại thành REQUIRES_NEW sẽ ngăn chặn ngoại lệ? (fyi chúng tôi tiêm hầu hết các SFSB vào các hạt được quản lý JSF) – Primi

+0

Có hoàn toàn. Tôi sẽ đi với YÊU CẦU thay vì REQUIRES_NEW, sau đó phương pháp sẽ tham gia vào một giao dịch hiện tại nếu có, hoặc tạo riêng của nó nếu không. Tôi đã dành nhiều ngày để tìm hiểu điều này - Tôi không thích tái cấu trúc miền mã của mình để uốn cong xung quanh các công cụ, tôi thích uốn công cụ hơn. Điều đó nói rằng tôi là một người nghiệp dư hoàn chỉnh nên có lẽ có thể làm với việc chọn những trận chiến của tôi tốt hơn! – user1180316