如何解决在JPA / JTA事务中调用HTTP服务-事务完整性
| 我有一个使用容器管理的持久性的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,然后在出现任何错误时记入用户
发生,但是没有交易完整性。
这对我来说是新的领域,有人能指出我正确的方向吗?
确定的方式来做我想做的事?
非常感谢。
ps。我在Seam 3中使用glassfish 3.1堆栈
解决方法
我不确定jax-rs通讯层如何。如果通信是单线程的,则您编写的代码是长时间运行的事务。这可能会使您的应用程序变慢。
我不是技术专家,但我可以建议的是-
记入帐户,并在线程上进行jax-rs调用。在这种情况下,在将呼叫发送到远程节点之前,交易将被关闭。而且它不会是长期运行的事务,因此应用程序会更快。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。