Cách chính xác để thực hiện việc này trong EJB của bạn là sử dụng ManagedExecutorService, một phần của API Uturrency Concurrency (Java EE7). Bạn không nên sử dụng bất kỳ ExecutorService nào là một phần của java.util.concurrent trong mã doanh nghiệp của bạn.
Bằng cách sử dụng ManagedExecutorService, chuỗi mới của bạn sẽ được tạo và quản lý bởi vùng chứa.
Ví dụ sau được lấy từ trang web của tôi here.
Để tạo một chuỗi mới bằng ManagedExecutorService, trước tiên hãy tạo đối tượng nhiệm vụ triển khai Thực hiện cuộc gọi. Trong phương thức call() chúng ta sẽ định nghĩa công việc mà chúng ta muốn thực hiện trong một thread riêng biệt.
public class ReportTask implements Callable<Report> {
Logger logger = Logger.getLogger(getClass().getSimpleName());
public Report call() {
try {
Thread.sleep(3000);
catch (InterruptedException e) {
logger.log(Level.SEVERE, "Thread interrupted", e);
}
return new Report();
}
}
Sau đó, chúng ta cần phải gọi nhiệm vụ bằng cách đi qua nó mặc dù phương pháp nộp() của ManagedExecutorService.
@Stateless
public class ReportBean {
@Resource
private ManagedExecutorService executorService;
public void runReports() {
ReportTask reportTask = new ReportTask();
Future<Report> future = executorService.submit(reportTask);
}
}
Nguồn
2013-10-16 13:20:30
Hơi O/T: Đây là một mô hình rất tốt (chúng tôi sử dụng nó rất nhiều), tuy nhiên nó thiếu ngắn khi thuật toán của bạn yêu cầu các hồ bơi riêng biệt để ngăn chặn deadlocks (xem EJB Spec vấn đề thảo luận về điều này) –
Chúng tôi sử dụng cùng một thiết kế trong ứng dụng của chúng tôi nhưng gần đây chúng tôi đang phải đối mặt với rất nhiều dữ liệu ghi đè trong cơ sở dữ liệu khi chúng tôi đang chạy hành động hàng loạt trong nền bằng cách sử dụng các nhà thực thi. Bất kỳ ý tưởng nào nếu đó có thể là một vấn đề phổ biến/đã biết. Nếu có, sau đó có thể có một sửa chữa có sẵn – Adhir
Cách chính xác để làm điều này là sử dụng một ManagedExecutorService, câu trả lời của tôi [dưới đây] (http://stackoverflow.com/questions/13932083/jboss-java-ee-container-and- a-executorservice/19404609 # 19404609) –