2010-04-12 27 views
7

Tôi muốn triển khai gửi email không đồng bộ trong ứng dụng web của mình khi người dùng đăng ký tài khoản mới. Điều này là để nếu có sự cố hoặc chậm trễ trong việc gửi thư email (ví dụ: máy chủ thư bị hỏng hoặc kết nối mạng đến máy chủ thư chậm), người dùng sẽ không được chờ đợi để gửi xong.Xử lý email không đồng bộ trong ứng dụng web Java

Ứng dụng web của tôi được tạo bằng cách sử dụng triển khai JPA của Spring và Hibernate.

Cách tốt nhất và đáng tin cậy nhất để tôi triển khai xử lý email không đồng bộ trong ứng dụng web này là gì?

Tôi đang suy nghĩ về việc lưu giữ thông tin email trong bảng cơ sở dữ liệu, sau đó thường xuyên được hỏi bởi một công việc được lập lịch biểu và khi tìm thấy email chưa gửi mới, nó cố gắng gửi chúng.

Đây có phải là cách hợp lý để triển khai những gì tôi muốn không?

Cảm ơn.

Edit:

Các bình chọn nhất trên phản ứng là để lại việc gửi mail như một cuộc gọi đồng bộ nhưng những gì đang gây ra suy nghĩ của tôi rằng một cách tiếp cận không đồng bộ có thể là tốt nhất là tôi đang sử dụng Gmail như mail gửi đi của tôi máy chủ (đây là để thử nghiệm trong khi phát triển) và tôi đang trải qua một sự chậm trễ 25 giây trong phản ứng từ khi ứng dụng của tôi cố gắng gửi email đến khi cuộc gọi đến chức năng gửi thư trả về. Bạn nghĩ sao?

Trả lời

4

Tôi khuyên bạn không nên bận tâm. Hầu hết các MTA kiểu Unix được phát minh và hoàn thiện chậm trễ trong nhiều thập kỷ trước và bạn không nên phát minh lại bánh xe. Bạn sẽ làm điều đó kém (so với sendmail hoặc postfix), và bạn sẽ bỏ lỡ một cái gì đó. Lời khuyên tốt nhất của tôi là sử dụng Java Mail APIS javax.mail và để thỏa thuận MTA với phần không đồng bộ.

+0

Vấn đề với cách tiếp cận này là tôi hiện đang sử dụng gmail làm máy chủ thư đi của tôi (đây là để thử nghiệm) và tôi gặp phải sự chậm trễ 25 giây khi ứng dụng của tôi cố gắng gửi email đến khi cuộc gọi đến chức năng gửi thư trả về. Đây là những gì đã kích hoạt suy nghĩ của tôi rằng một cách tiếp cận không đồng bộ có thể là tốt nhất. Bạn nghĩ sao? – JMM

+0

@Denise Tôi đồng ý với bit không đồng bộ. Bạn có thể chạy một luồng nền trong Servlet Engine của bạn, điều này sẽ đưa JavaMail "Messages" ra khỏi danh sách hoặc vectơ và thực hiện quá trình xử lý. –

2

Bạn có thể thực hiện xếp hàng bằng tay, sử dụng MySQL hoặc một số cơ chế liên tục khác, nhưng bạn cũng có thể sử dụng JMS để xếp hàng. Đó là một trận đấu hoàn hảo cho tình huống này.

Trong trường hợp đó, tôi sẽ bị cám dỗ bởi việc tách thành phần thư khỏi ứng dụng chính và cho phép hai giao tiếp sử dụng JMS. Ứng dụng chính đặt một tin nhắn trong JMS và ứng dụng bưu phẩm sẽ đăng ký hàng đợi và cố gắng xử lý các tin nhắn.

JMS có thể được thực hiện liên tục (ví dụ: MySQL) khá dễ dàng bằng cấu hình.

Lợi thế của việc chia tách webapp là bạn trừu tượng hóa cơ chế thông báo và có thể trong tương lai triển khai ví dụ: Google Wave hoặc IRC hoặc bất kỳ thứ gì mà không cần phải chạm vào ứng dụng chính của bạn.

Một người nào khác được đề xuất sử dụng postfix hoặc sendmail và để họ xử lý hàng đợi. Đó cũng là một giải pháp tuyệt vời, đặc biệt nếu bạn đặt postfix hoặc sendmail trên localhost và để cho nó định tuyến các thông điệp xa hơn. Đừng cố gắng để cấu hình mà chương trình bưu phẩm như vậy mà chỉ mail từ localhost được phép được chuyển, để ngăn chặn việc tạo ra một bưu phẩm mở :)

EDIT màu sáng việc sử dụng JMS + bình luận về daemon bưu phẩm địa phương

+0

JMS không bằng Java Mail. JMS không liên quan gì đến e-mail. –

+1

@Chris Không, xếp hàng có thể được thực hiện bởi JMS. – extraneon

+0

nó có thể, nhưng tôi nghĩ rằng nó quá phức tạp cho những gì người dùng muốn làm. Chắc chắn có thể làm được, và trong một số kiến ​​trúc, có lẽ thích hợp hơn (một ESB, ví dụ, tuân thủ HIPAA, có lẽ). –

0

Nó khá hợp lý, đây là loại điều mà Quartz đã xây dựng.

Tuy nhiên, lưu ý rằng bạn không cần phải lên lịch thông qua cơ sở dữ liệu chút nào (trừ khi thời gian ngừng máy chủ là vấn đề thực). Bạn có thể chỉ đơn giản là sắp xếp một công việc Quartz mà không cần truy cập cơ sở dữ liệu (ví dụ Quartz đơn giản nhất chỉ cho bạn cách thực hiện).

Nếu không, nếu bạn chọn truy cập cơ sở dữ liệu, bạn có khả năng gửi email từ một ứng dụng khác hoàn toàn (một điều tốt đẹp nếu bạn cần).

0

Java EE 6 làm cho việc này trở nên dễ dàng với chú thích @Asynchronous.

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