2010-01-14 39 views
9

Chúng tôi muốn phục vụ một số yêu cầu của khách hàng trong máy chủ ứng dụng Java EE của chúng tôi (JBoss 4.2.3). Tôi đọc rằng Java EE spec doesn't allow opening a socket from an enterprise bean. Nhưng spec cho thấy không có lựa chọn thay thế.Làm thế nào để phục vụ một ổ cắm từ một ứng dụng Java EE?

Cụ thể, enterprise bean không nên:

  • nghe trên, chấp nhận kết nối trên, hoặc multicast từ một ổ cắm mạng

Vì vậy, câu hỏi là: Tôi có thể làm gì để phục vụ một số giao thức dựa trên tcp nhị phân tcp (không phải http) từ bên trong máy chủ ứng dụng?

Here người nào đó đề xuất triển khai resource adapter. Đây có phải là cách bạn phải đi hoặc có giải pháp nào khác (dễ hơn) không?

Trả lời

1

Ngay bây giờ tôi thực hiện một cách giải quyết:

alt text http://yuml.me/7f82bd5c

tôi sử dụng một ứng dụng java độc lập chấp nhận cuộc gọi tcp từ khách hàng và chuyển tiếp chúng như JNDI các cuộc gọi đến các máy chủ ứng dụng.

+2

Java Naming và Directory Interface (JNDI), bạn thường thực hiện các cuộc gọi tra cứu, bạn có thể tra cứu một ejb và thực hiện cuộc gọi từ xa để xử lý dữ liệu nhận được từ máy chủ độc lập của bạn. – stacker

2

Không, bạn nên truy cập các tập :(

Đây là trong spec vì EJB phải là:

  • chia (bạn không biết trước về những gì máy chủ/dụ EJB của bạn sẽ được triển khai
  • container là để có thể quản lý "tất cả mọi thứ", do đó bạn không phải đẻ trứng chủ đề của riêng bạn

Đó nhớ gì sẽ ngăn chặn bạn khỏi Startin ga máy chủ ổ cắm trong ứng dụng của bạn (nơi tốt nhất có thể là trong một servlet) nhưng bạn nên cẩn thận về cách đóng gói máy chủ khi ứng dụng của bạn bị đóng ...

7

Bạn nói đúng, vì bạn có thể khai báo giao dịch cho mọi thứ trong Java EE, chúng phải được hỗ trợ từ tất cả các thành phần bạn muốn kết nối. Tập tin nếu có nên được lưu trữ trong cơ sở dữ liệu. Mọi thứ nên được kiểm soát bởi vùng chứa, bởi vì nó là cách duy nhất để có một ứng dụng mở rộng quy mô sử dụng Java EE.

Một vài lựa chọn:

  • Thực hiện một kết nối (JCA) một ví dụ là ở đây: http://www.theserverside.com/tt/articles/article.tss?l=J2EE1_4 khách hàng có lẽ là cách tốt nhất nếu bạn đã có sẵn.

  • Sử dụng Java Message Queues

  • Mối quan hệ giữa các kỹ thuật này sẽ được thảo luận ở đây http://java.sun.com/products/jms/faq.html#relship_ejbs

  • Write máy chủ người lưu trữ các yêu cầu trong CSDL. (Không hỗ trợ Tx)

  • Nếu bạn chỉ có một máy chủ và có vẻ như quá nhiều chi phí, bạn có thể bỏ qua các khía cạnh này và làm theo đề xuất của Vinegars. Nhưng nếu bạn cần Tx sau hoặc các nút bổ sung thì phần này phải được thiết kế lại.

+1

+1: Cảm ơn bạn đã liên kết đến ví dụ về JCA. – tangens

+1

lưu ý rằng ví dụ JCA này là dành cho JCA 1.5 và bài viết là từ năm 2003. Điều này bao gồm JCA 1.6 được bao gồm trong javaEE 6, phiên bản đó ít hơn rất nhiều yêu thương XML: http://www.oraclejavamagazine-digital.com/javamagazine/ 20120910 /? Pg = 56 & pm = 1 & u1 = friend # pg56 –

+1

Tôi đang thử một bean với Singleton và Startup và sắp xếp các sự kiện thông qua Tin nhắn. Sau khi @pgras nhận xét "Điều đó trong tâm trí không có gì sẽ ngăn cản bạn từ bắt đầu một ổ cắm máy chủ trong ứng dụng của bạn" nó có vẻ khá an toàn. – stuartw

0

Tôi đã sử dụng một số giải pháp tương tự theo nhu cầu của tôi trong Spring MVC. Có thể điều này có thể giúp ai đó ở đây.

Khởi động Cổng Ổ cắm khi khởi động máy chủ. Tôi đã sử dụng chú thích @scheduler trong khi bạn cũng có thể sử dụng giải pháp dựa trên người nghe. Bạn cũng có thể thực hiện trình lắng nghe ApplicationContextAware và có thể truy cập các bean ứng dụng khác từ nó.

@Scheduled(fixedDelay = 1000 * 60 * 60 * 24 * 365) 
public void startListenerPort() { 
    ServerSocket socket = new ServerSocket(9999); 
    // do some stuff here 
} 

Chỉ cần đảm bảo rằng bạn đã cho phép lưu lượng TCP trên cổng mà bạn đã gán cho Ổ cắm (Thiết đặt Tường lửa).

Bằng cách này, bạn có thể có lưu lượng truy cập TCP trên cổng 9999, khi máy chủ ứng dụng của bạn sẽ tiếp tục chạy trên cổng khác như bình thường.

0

Mặc dù không hoàn toàn là kết nối TCP, nhưng bạn có thể đạt được những gì bạn cần với chú thích @ServerEndpoint để tạo WebSocket từ thông số Java EE7.

Mặc dù điều này sử dụng HTTP, nó sẽ hoạt động giống như giao diện nhị phân khi phương pháp @OnMessageByteBuffer (hoặc byte[]) làm đối số.

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