Tôi đang viết một ứng dụng Java dành cho doanh nghiệp sử dụng các phương thức EJB 3.1 không đồng bộ để thực hiện một số tác vụ song song. Để hỗ trợ hủy một tác vụ chạy dài, tôi đã cố gắng sử dụng giao diện Tương lai.Hủy cuộc gọi EJB không đồng bộ @
Thật không may khi gọi future.cancel(true)
từ ứng dụng khách sẽ không ảnh hưởng đến ngữ cảnh phiên của bean thực hiện tác vụ, mặc dù thực tế lệnh hủy đang trả về true
.
Tôi có một giao diện đơn giản:
public interface AsyncInterface
{
Future<Integer> run() throws Exception;
}
Với cài đặt bean như sau:
@Stateless
@Remote(AsyncInterface.class)
public class AsyncBean
{
@Resource SessionContext myContext;
@Asynchronous
public Future<Integer> run() throws Exception
{
Integer result = 0;
System.out.println("Running AsyncBean");
while(myContext.wasCancelCalled() == false)
{
Thread.sleep(2000);
System.out.println("Working");
}
System.out.println("AsyncBean cancelled");
return new AsyncResult<Integer>(result);
}
}
Mã khách hàng là thẳng về phía trước:
InitialContext ctx = new InitialContext();
AsyncInterface async = (AsyncInterface)ctx.lookup("AsyncBean/remote");
Future<Integer> future = async.run();
if(future.cancel(true))
{
System.out.println("future.cancel() returned true");
}
else
{
System.out.println("future.cancel() returned false");
}
Sản lượng từ đậu là một luồng vô tận của "Làm việc"; nó không bao giờ phát hiện việc hủy bỏ.
Trong trường hợp có liên quan, tôi đang chạy ứng dụng trên Máy chủ ứng dụng JBoss 6.0.0. Tôi đã không đặt nhiều mẫu mã bằng cách sử dụng tính năng hủy bỏ của giao diện tương lai, vì vậy tôi tự hỏi nếu tôi đang sử dụng tương lai một cách chính xác. Việc sử dụng này có chính xác không? Có các tùy chọn tốt hơn để hủy cuộc gọi phương thức EJB không đồng bộ không?
Đó là một hành vi kỳ quặc vì nếu phương thức hủy trả về true, cho biết phương thức bean phiên của bạn sẽ không được gọi (lý do là vì khi bạn gọi hủy, phương thức có thể đang chạy). Bạn có thể kiểm tra thêm thông tin về điều này trong phần 3.4.8.1.1 của đặc tả EJB 3.1. –
Liên kết câu hỏi này với câu hỏi tương tự, nhưng đối với glassfish http://stackoverflow.com/q/16493381/3701228 – Gas