EJB 3.1 - 处理异步作业中的异常

时间:2010-07-27 23:05:33

标签: java exception-handling java-ee ejb-3.1

我有几个异步作业,我想透明地处理异常。我想将异常处理逻辑放在另一个组件/类中。使用Seam 2,我扩展了一个异常处理程序类。

例如,我想引发一个带有异常的事件,这样我就可以在他们认为合适时使用几个组件。最常见的是通知管理员的那个。

谢谢,

沃尔特

1 个答案:

答案 0 :(得分:1)

以下是您可能适应的Part Three: New Features in EJB 3.1示例:

  

会话Bean的异步调用

     

异步处理是一个   令人惊讶的普遍要求   许多企业应用。一些   最明显的用例是   触发即发即忘的背景   进程,处理长时间运行的任务   同时保持用户界面   接受或简单地增加   利用应用程序吞吐量   并行处理的好处。   最简单的实施方式   Java EE中的异步处理   今天的应用程序使用Message   驱动豆。实际上,第一个   EJB 3中的Message Driven Bean示例   in Action用于实现   异步订单计费。更多   确切地说,是一个消息驱动Bean   (OrderBillingMDB)异步   订单发生后向客户开账单   确认并更新订单   信息与结果   结算尝试一旦完成。   图1显示了这种情况:

     

alt text

     

图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>   然而。异步调用   支持其他一些简洁的功能   像交货保证和   交易发送语义。对于   详细信息,请查看规范草案。

如果您遇到特定问题,请提出更具体的问题:)

另见