我有几个异步作业,我想透明地处理异常。我想将异常处理逻辑放在另一个组件/类中。使用Seam 2,我扩展了一个异常处理程序类。
例如,我想引发一个带有异常的事件,这样我就可以在他们认为合适时使用几个组件。最常见的是通知管理员的那个。
谢谢,
沃尔特
答案 0 :(得分:1)
以下是您可能适应的Part Three: New Features in EJB 3.1示例:
会话Bean的异步调用
异步处理是一个 令人惊讶的普遍要求 许多企业应用。一些 最明显的用例是 触发即发即忘的背景 进程,处理长时间运行的任务 同时保持用户界面 接受或简单地增加 利用应用程序吞吐量 并行处理的好处。 最简单的实施方式 Java EE中的异步处理 今天的应用程序使用Message 驱动豆。实际上,第一个 EJB 3中的Message Driven Bean示例 in Action用于实现 异步订单计费。更多 确切地说,是一个消息驱动Bean (
OrderBillingMDB
)异步 订单发生后向客户开账单 确认并更新订单 信息与结果 结算尝试一旦完成。 图1显示了这种情况:
图1:异步订单结算
使用Message Driven Beans时 异步处理肯定 工作,它也迫使你处理 消息传递和JMS,即使是相对的 轻量级功能。这是 恰恰是异步问题 会话bean调用旨在 解决。通过此增强功能,您可以 简单地进行异步处理 用。注释会话bean方法
@Asynchronous
注释。让我们 看一下重构的EJB 3 在异步的Action示例中 使用该功能进行结算:@Stateless public class OrderBillingServiceBean implements OrderBillingService { ... @Asynchronous public void billOrder(Order order) { try { // Attempt to charge the order. bill(order); // Send email notification of billing success. notifyBillingSuccess(order); order.setStatus(OrderStatus.COMPLETE); } catch (BillingException be) { // Send email notification of billing failure. notifyBillingFailure(be, order); order.setStatus(OrderStatus.BILLING_FAILED); } finally { update(order); } } ... }
由于
@Asynchronous
客户端调用时的注释OrderBillingService.billOrder
方法,调用将返回 立即而不是阻止直到billOrder
方法完成 执行。 EJB容器将成为 确定该方法得到执行 异步(可能使用 引擎盖下的消息传递)。尽你所能 看,回归的类型 异步方法无效。这将 可能是一个巨大的案例 大多数异步会话bean 方法。但是,EJB 3.1也可以 支持返回类型java.util.concurrent.Future<V>
, 其中V
表示结果 异步调用的值。 如果你不熟悉它,Future<V>
界面允许您 做取消等的事情 异步调用,检查是否 调用完成后,检查 异常并获得结果 异步调用。查看Future<V>
的文档 界面在这里: http://java.sun.com/javase/6/docs/api/java/util/concurrent/Future.html。 我们来看一个例子吧 使用Future返回类型。在 前面的billOrder
方法 例如,我们设置了状态 根据结果的顺序 计费尝试并更新订单。 让我们假设调用者更新 订单本身,想知道 结算尝试的状态是什么 是。我们可以通过重构来做到这一点billOrder
方法如下:@Stateless public class OrderBillingServiceBean implements OrderBillingService { ... @Asynchronous public Future<OrderStatus> billOrder(Order order) { try { // Attempt to charge the order. bill(order); // Send email notification of billing success. notifyBillingSuccess(order); return new AsyncResult<OrderStatus>(OrderStatus.COMPLETE); } catch (BillingException be) { // Send email notification of billing failure. notifyBillingFailure(be, order); return new AsyncResult<OrderStatus> (OrderStatus.BILLING_FAILED); } } ... }
javax.ejb.AsyncResult<V>
个对象 是一个方便的实现Future<V>
界面。需要的 异步调用的结果 作为构造函数的参数。有 什么都阻止你使用你的 自己实施Future<V>
然而。异步调用 支持其他一些简洁的功能 像交货保证和 交易发送语义。对于 详细信息,请查看规范草案。
如果您遇到特定问题,请提出更具体的问题:)