【问题标题】:Calling a HTTP service within a JPA/JTA transaction - transaction integrity在 JPA/JTA 事务中调用 HTTP 服务 - 事务完整性
【发布时间】:2011-05-26 13:45:23
【问题描述】:

我有一个使用容器管理持久性的 JSF/EJB/JPA 应用程序。有 通过 HTTP 调用外部服务的一种情况是有成本的,这 成本被分配回请求用户。在当前的实施中 发出 HTTP 请求的过程由周期性运行的 EJB 计时器方法执行 在后台。

计时器方法可能必须在一次调用中处理多个请求,尽管 每个请求都需要独立处理,独立于分配 将成本返还给用户,即。如果用户 A 没有足够的信用来购买 书,这不能阻止用户 B 成功购买一本书,从而导致他们 由于回滚,余额被借记。

提供对事务分界的控制,以便独立处理每个事务 请求我正在为计时器方法所在的类使用 bean 托管事务 居住。这是我现在得到的 java 伪代码版本:

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class MessageTimer {
  private void processMessages(UserMessage msg) {
    tx.begin();
    em.joinTransaction();

    try {
      userData = em.find(..., PESSIMISTIC_WRITE);

      if(user has enough credit) {
        debit cost from user;

        status = make external http request to order book from supplier;
        if(status == success) {
          commit = true;
        }
      }
    } catch(Exception) {
      tx.rollback();
    }

    if(commit) {
      tx.commit();
    }
    else {
      tx.rollback();
    }
  }
}

所以我的想法是我开始交易,假设成功并从 如果成功则调用http服务并提交,否则回滚。

我有一种不安的感觉,我可能不会在正确的球场附近 设计,特别是在内部有冗长的 http 调用(实际上是使用 jax-rs 完成的) pessimistic_write 事务。我想知道我是否可以首先在交易中 借记用户(开始/借记/提交),进行 http 调用,如果有任何错误,则记入用户 发生,但没有交易完整性。

这对我来说是新的领域,谁能指出我正确的方向,有没有 做我想做的事的既定方式?

非常感谢。

附言我正在使用带有 Seam 3 的 glassfish 3.1 堆栈

【问题讨论】:

    标签: rest jpa ejb jta bean-managed-transactions


    【解决方案1】:

    我不确定 jax-rs 通信层是怎样的。如果通信是单线程的,那么您编写的代码是一个长时间运行的事务。这可能会使您的应用程序变慢。

    我不是技术大师,但我可以建议的是 -

    贷记帐户并在线程上调用 jax-rs。在这种情况下,事务将在向远程节点发送调用之前关闭。而且它不会是一个长时间运行的事务,因此应用程序会更快。

    【讨论】:

    • 嗨,我在 EJB 容器中运行,所以我认为不能使用线程。我需要 http 调用的结果来确定是否产生了成本,所以我不确定我有什么选择。当然,这是一项长期运行的交易,但我看不出有什么办法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2012-06-28
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    相关资源
    最近更新 更多