Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中进行涉及jdbc、jms和WebService的分布式事务_Java_Transactions - Fatal编程技术网

如何在java中进行涉及jdbc、jms和WebService的分布式事务

如何在java中进行涉及jdbc、jms和WebService的分布式事务,java,transactions,Java,Transactions,在一次采访中,我被问到以下问题,但我无法回答 如何将jdbc操作、web服务调用和JMS操作包含到一个事务中。这意味着,如果其中一个失败,则必须回滚所有 我听说过在涉及多个数据库的数据库事务中使用两阶段提交协议和OraclXA。但不确定是否可以在这里使用相同的方法 关键因素是您连接到的web服务是使用支持事务的web服务框架构建的。JBoss Narayana就是这样一个web服务框架。一旦您连接到的web服务端点位于这样的框架上,就只需配置spring以使用适当的客户端 对于Narayana,

在一次采访中,我被问到以下问题,但我无法回答

如何将jdbc操作、web服务调用和JMS操作包含到一个事务中。这意味着,如果其中一个失败,则必须回滚所有


我听说过在涉及多个数据库的数据库事务中使用两阶段提交协议和OraclXA。但不确定是否可以在这里使用相同的方法

关键因素是您连接到的web服务是使用支持事务的web服务框架构建的。JBoss Narayana就是这样一个web服务框架。一旦您连接到的web服务端点位于这样的框架上,就只需配置spring以使用适当的客户端

对于Narayana,使用web服务进行事务的spring配置(从):


这可能是个骗人的问题,正确的答案是“做不到”

但我会尝试编写类似这样的代码:

try{
jdbc.startTransaction();
Savepoint saveJdbc = jdbc.setSavepoint();
JMS.startTransaction();
Savepoint saveJMS = JMS.setSavepoint();
jdbs.doSomeStuff();
JMS.doSomeStuff();
jdbc.commit();
JMS.commit(); 
if(webServise.doSomeStuff() == fail){throw new Exception();} 
}
catch(Eception e){
jdbc.rollback(saveJdbc);
JMS.rollback(saveJMS);
}
你准备了一份已经倒转的服务。你准备了第二份已经倒转的菜。您将尝试web服务,如果web服务失败,您将回滚已回滚的两个


这可能是一种实现对web服务回滚的方法。

由于系统是分开的,您永远无法以完全防爆炸的方式实现这一点。系统某个阶段的故障(例如,在SQL提交和JMS提交之间,服务器上的电源关闭)将使SQL提交保持原位

解决这个问题的唯一方法是在某个地方保留一些部分提交的记录,并在启动时扫描这些记录,以修复任何由此产生的问题。但是现在,如果处理或保留该列表失败,会发生什么情况呢

基本上,解决方案是自行实现多阶段提交和回滚过程,该过程包含您需要执行的三个操作。如果任何操作失败,那么您需要反转(最好使用内部事务机制,如果没有,则通过发出反转命令)到目前为止已经完成的任何操作


<> P.>这样的系统会有很多角落的案例和潜在的方法,所以真正的第一种方法应该是考虑你是否可以重新设计系统,这样你就不需要这样做了!p> 我们遇到了同样的情况,比如web服务将推送数据,我们必须读取xml流并持久化到db(oracle)。我们遵循的实现是

  • Web服务发送包含xml流数据的soap消息

  • 所有请求soap消息都推送到jms

  • 相应的listner将读取流并将数据持久化到“临时表”中

  • 若请求处理成功,则将数据从临时表移动到实际表

  • 如果有任何错误,请回滚

    希望以上几点能有所帮助


  • 在我看来,面试官似乎喜欢了解你们在企业范围内的分布方面的思考能力。几点:

  • JDBC用于数据库连接
  • WebService可能是一种向用户发送控制命令的机制 任何客户端的服务器
  • JMS主要用于警报系统中正在发生的事情 系统
  • 我猜你的面试官可能有一个典型的情况,他们希望满足以下情况:

    数据位于一层(群集或计算机) 客户可以是任何类型的,移动、应用、ios、objective c、浏览器付费等。 JMS被配置为侦听主题。或者是他希望他能做到


    现在最好的方法可能是编写一个JMS订户,它决定在
    onMessage()方法中执行什么操作。例如,假设一个web服务是从客户机发起的付款请求。这将启动一个JMS发布器,告诉DAO进行必要的到数据库的内部连接,当事务处于中间时,当事务完成时,一条消息将发布到订阅服务器。您将拥有对每个步骤的完全粒度控制,因为这些步骤将被配置为通过JMS发布。虽然这很难实现,但这可能是面试官期望你采取的方法。(这只是我的猜测,请注意。)

    JMS系统也可以支持XA。但是网络服务。。。不可能。