2009-02-05 35 views
7

Tôi đang gặp khó khăn trong việc tìm hiểu làm thế nào để kiến ​​trúc phần cuối cùng của hệ thống của tôi. Hiện tại tôi đang chạy một máy chủ Tomcat có một servlet đáp ứng các yêu cầu của máy khách. Mỗi yêu cầu lần lượt thêm một thông báo xử lý vào một hàng đợi không đồng bộ (có thể tôi sẽ sử dụng JMS thông qua Spring hoặc nhiều khả năng là SQS của Amazon).Whats cách tốt nhất để xử lý hàng đợi không đồng bộ liên tục trong Java là gì?

Chuỗi sự kiện là:

Sending phụ:
1. Hãy yêu cầu khách hàng
2. Thêm một số dữ liệu vào một DB liên quan đến yêu cầu này với một ID duy nhất
3. Thêm một đối tượng nhắn đại diện cho yêu cầu này vào hàng đợi thông điệp

Tiếp nhận phụ:
1. Kéo một đối tượng tin nhắn mới từ hàng đợi
2. Unwrap đối tượng và lấy một số thông tin từ một trang web dựa trên thông tin chứa trong đối tượng msg.
3. Gửi cảnh báo qua email
4. cập nhật hàng DB của tôi (cùng một ID duy nhất) với thông tin hoạt động đã được hoàn thành cho yêu cầu này.

Tôi đang gặp khó khăn trong việc tìm cách xử lý đúng cách mặt nhận. Một mặt tôi có thể tạo một chương trình java đơn giản mà tôi khởi động từ dòng lệnh chọn từng mục trong hàng đợi và xử lý nó. Có an toàn không? Liệu nó có ý nghĩa hơn khi có chương trình chạy như một luồng khác bên trong thùng chứa Tomcat không? Tôi sẽ không muốn làm điều này một cách trung thực, có nghĩa là đầu nhận sẽ có thể xử lý nhiều đối tượng cùng một lúc - sử dụng nhiều luồng. Tôi muốn điều này luôn luôn chạy, 24 giờ một ngày.

Một số tùy chọn để xây dựng mặt tiếp nhận là gì?

+0

Trong trường hợp ai đó quan tâm đến những gì cuối cùng tôi đã làm. Tôi đã sử dụng SQS của Amazon và có một máy khách java (sử dụng khung công tác Spring) để thăm dò hàng đợi. Khi nó tìm thấy một msg nó xử lý nó và trở lại trạng thái chờ. Tôi có thể thêm Quartz luồng, bây giờ tôi chỉ cần khởi động nhiều quy trình. – Ish

+0

Tôi đang đối mặt với một vấn đề tương tự. Tôi muốn biết Java Client đã được triển khai như thế nào. Tôi hy vọng nó không chạy trong một vòng lặp vô hạn trong khi và hồ bơi cho tin nhắn? –

Trả lời

3

"Một mặt tôi có thể tạo một chương trình java đơn giản mà tôi khởi động từ dòng lệnh chọn từng mục trong hàng đợi và xử lý nó. Có an toàn không?"

Điều gì không an toàn về nó? Nó hoạt động tuyệt vời.

"Có ý nghĩa hơn khi chương trình đó chạy dưới dạng một chuỗi khác bên trong vùng chứa Tomcat không?"

Chỉ khi Tomcat có nhiều thời gian rảnh để xử lý nền. Thông thường, này là trường hợp - bạn có thời gian rảnh để thực hiện loại xử lý này.

Tuy nhiên, chuỗi không tối ưu. Các chủ đề chia sẻ các tài nguyên I/O phổ biến và luồng nền của bạn có thể làm chậm phần front-end.

Tốt hơn là có hàng đợi JMS giữa giao diện người dùng "cổng 80" và quy trình phụ trợ riêng biệt. Quá trình back-end bắt đầu, kết nối với hàng đợi, tìm nạp và thực hiện các yêu cầu. Quá trình phụ trợ có thể (nếu cần thiết) là đa luồng.

0

Tôi đã thực hiện loại điều này bằng cách lưu trữ người nhận trong máy chủ ứng dụng, weblogic trong trường hợp của tôi, nhưng tomcat cũng hoạt động tốt. Không thăm dò hàng đợi, sử dụng mô hình dựa trên sự kiện. Điều này có thể được mã hóa bằng tay hoặc nó có thể là một dịch vụ web hướng tin nhắn. Nếu cập nhật cơ sở dữ liệu là không có giá trị, bạn có thể cập nhật cơ sở dữ liệu và gửi email, sau đó đưa ra cam kết trên hàng đợi. Nó không phải là một vấn đề để có một số chủ đề mà tất cả đọc từ cùng một hàng đợi.

Tôi đã sử dụng các giải pháp JMS khác nhau, bao gồm tibco, activemq (trước khi apache gộp nó) và joram. Joram là giải pháp mã nguồn mở đáng tin cậy hơn, nhưng điều đó có thể đã thay đổi ngay bây giờ vì nó là một phần của apache.

+0

Bạn có thể giải thích cách triển khai mô hình dựa trên sự kiện không? –

+0

Hãy xem http://docs.oracle.com/cd/E13222_01/wls/docs90/jms/implement.html#1188496, phần có tiêu đề "Nhận thư không đồng bộ". –

1

Nếu bạn đã sử dụng Spring, hãy xem DefaultMessageListenerContainer. Nó cho phép bạn tạo một tin nhắn POJO điều khiển đậu. Điều này có thể được sử dụng từ bên trong một thùng chứa ứng dụng hiện có (tệp tin WAR của bạn) hoặc như một quá trình riêng biệt.

+0

Trong trường hợp này, người tiêu dùng bỏ phiếu hàng đợi liên tục hoặc nhận thông báo bằng cách nào đó? – Ish

+0

Tôi khá chắc chắn các cuộc thăm dò DefaultMessageListenerContainer. Điều tốt đẹp về nó là nó ẩn các vấn đề thăm dò ý kiến ​​/ thông báo từ bạn. Bạn chỉ cần thực hiện một MessageListener jms và làm bất cứ công việc nào bạn cần làm. –

2

Nếu bạn đang sử dụng JMS, tại sao bạn đặt nhiệm vụ vào DB?

Bạn có thể sử dụng Hàng đợi bền trong JMS. Điều này sẽ giữ nhiệm vụ, ngay cả khi nhà môi giới JMS chết, cho đến khi họ được thừa nhận. Bạn có thể có các nhà môi giới dư thừa để nếu một người môi giới chết, người thứ hai sẽ tự động tiếp quản. Điều này có thể đáng tin cậy hơn so với sử dụng một DB duy nhất.

+0

Bởi vì tôi sẽ lấy một số thông tin từ trang web mục tiêu và đặt nó cùng với hàng trong DB. Thông tin này sau đó sẽ cần phải được truy xuất bởi một khách hàng tại một số điểm sau đó trong thời gian. Tôi không thực sự sử dụng db cho dự phòng nhiều như lưu trữ dữ liệu để truy xuất sau này. – Ish

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