Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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 在@Transactional方法之前和之后执行代码_Java_Spring - Fatal编程技术网

Java 在@Transactional方法之前和之后执行代码

Java 在@Transactional方法之前和之后执行代码,java,spring,Java,Spring,我们有一个基于Spring的应用程序,其服务层用@Transactional注释。出于以下原因,我们需要在某些事务方法之前和之后运行代码: 我们需要基于密钥同步对该方法的访问。线程需要在事务开始之前阻塞 如果事务成功,我们需要在队列上发布消息 选择似乎是: 创建一个类,该类使用与服务类似的方法,可以在同步块中运行@Transactional方法,并检查返回,然后发布消息(由于AOP代理问题,需要单独的类)。服务呼叫服务,不好,感觉像是一种工作 编写一个方面来包装@Transactional AO

我们有一个基于Spring的应用程序,其服务层用@Transactional注释。出于以下原因,我们需要在某些事务方法之前和之后运行代码:

  • 我们需要基于密钥同步对该方法的访问。线程需要在事务开始之前阻塞
  • 如果事务成功,我们需要在队列上发布消息
  • 选择似乎是:

  • 创建一个类,该类使用与服务类似的方法,可以在同步块中运行@Transactional方法,并检查返回,然后发布消息(由于AOP代理问题,需要单独的类)。服务呼叫服务,不好,感觉像是一种工作
  • 编写一个方面来包装@Transactional AOP,它可以执行同步和消息发布。可能有效,但宁愿避免AOP
  • 将事务向下移动到域层。由于域方法在不同工作流中的重用方式,对于当前的实现来说不可取,甚至可能不可行
  • 手工在服务方法中对事务进行编码,并报废@Transactional
  • 我想这是一个相当普遍的要求。可能我错过了一个选项5,这是显而易见的一个

    在这种情况下,我会使用(您的选项4)并通过编程控制事务的范围


    否则,您可以将方法中的逻辑移出到一个单独的服务中,使该新服务成为@Transactional,从当前方法中删除@Transactional,然后使用事务前和事务后逻辑围绕对新服务的调用。我也采用了这种方法,但我更喜欢这样的需求,因为我认为它更干净,而且正如您所提到的,调用服务的服务(只有第一个服务才需要)感觉像是一种黑客的解决方法。

    我想我会选择2,除非您有一些特定的理由避免AOP。您的问题是可以使用AOP的一个经典示例,结果看起来相当不错。下面是一个很好的示例,说明了如何实现这一点(如果您还没有读过的话):


    如果AOP真的不是一个选项,我会选择@Lawrence McAlpin提出的“否则”选项。

    检查回调接口。Spring可以以本机方式通知您事务发生了什么。

    如果密钥作为方法调用的一部分传递,那么您可以使用java来完成这项工作。。它更简单、更干净。

    同意这一点,我不明白在这种情况下为什么要避免AOP。这是最干净的方法,毕竟@Transactional也使用AOP。因此,连接另一个方面将是最好和最简单的事情。一定要使用AOP。正如@Sean所指出的,您已经将SpringAOP与@Transactional一起使用,Spring特别支持,因此您可以告诉它在不需要额外工作的情况下运行每个@Transactional方法。谢谢。没有根本的理由避免AOP,只是个人偏好和过去的一些不好的经历!我倾向于为同步需求编写一个方面,因为它似乎适合AOP最擅长的方面,即真正的横切。对于“在事务提交时做一些事情”的要求,我喜欢Tomasz提到的回调解决方案。这对于Tomasz的消息发布要求非常有用,谢谢。事实上,这可能是解决其他几个长期存在的问题的方法,这很好。