spring事务超时可配置

2024-01-03

我有一个具有固定超时的事务方法。有没有一种方法可以通过即配置来配置事务超时application.yml?

@Transactional(propagation = Propagation.REQUIRED, timeout = TIMEOUT)
public String doStuff(String id) throws Exception {
    service.doSomeStuff
}

由于我们无法将变量值分配给Java注释属性,因此以编程方式设置@Transactional 's timeout,你最好的选择是覆盖AbstractPlatformTransactionManager#determineTimeout().

假设您正在使用JpaTransactionManager,新的经理看起来像下面的代码。它允许设置每个事务的超时。我们可以用TransactionDefinition标识事务的名称,对于 Spring 声明式事务,默认名称格式为FullyQualifiedClassName.MethodName.

public class FooTransactionManager extends JpaTransactionManager {
    
    private Map<String, Integer> txTimeout = new HashMap<String, Integer>();

    public <T> void configureTxTimeout(Class<T> clazz, String methodName, Integer timeoutSecond) {
        txTimeout.put(clazz.getName() + "." + methodName, timeoutSecond);
    }

    //The timeout set by `configureTxTimeout` will have higher priority than the one set in @Transactional
    @Override
    protected int determineTimeout(TransactionDefinition definition) {;
        if (txTimeout.containsKey(definition.getName())) {
            return txTimeout.get(definition.getName());
        } else {
            return super.determineTimeout(definition);
        }
    }   
}

然后配置PlatformTransactionManager:

@Bean
public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
    final FooTransactionManager transactionManager = new FooTransactionManager();
    transactionManager.setEntityManagerFactory(emf);

    transactionManager.configureTxTimeout(Foo.class, "doStuff", 10);
    transactionManager.configureTxTimeout(Bar.class, "doStuff", 20);
    transactionManager.configureTxTimeout(Bar.class, "doMoreStuff", 30);
    //blablabla
    
    return transactionManager;
}

上面的代码仅用于演示目的。实际上,您可以使用@Value从外部属性读取值(例如application.yml)在配置过程中。


2020 年 6 月 25 日更新:

  • 它将在即将到来的 5.3 中得到开箱即用的支持(请参阅this https://github.com/spring-projects/spring-framework/issues/25052)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring事务超时可配置 的相关文章

随机推荐

  • 将文本附加到现有 json 文件 node.js

    我正在尝试将新文本添加到现有的 json 文件中 我尝试了 writeFileSync 和appendFileSync 但是即使我使用 JSON stringify 添加的文本也不会格式化为 json const fs require fs
  • React & Jest 测试:连接到 Redux 的嵌套组件给出 Invariant Violation 错误

    因此 我导入了一个组件来使用 Jest 进行一些测试 class MyComponent extends Component render return div div
  • 如何从gwt调用jquery触发器?

    public static native void doConnect wnd jQuery document trigger connect jid sss password sss 我尝试了上述方法 但在 firebug 或 gwt 托
  • Shell 脚本错误:“head:无效的尾随选项 -- 1”

    我的 shell bash 脚本中有这段代码 用于将文件分割成更小的部分 for i start i lt lineCount i i interval do temp expr i interval if temp le lineCoun
  • NavigationStack 可搜索 .focused

    当用户单击搜索框以满足条件 显示另一个视图 时 我需要进行配置 一旦他单击 取消 以显示原始视图 已经可以通过 onChange of searchText value in if value isEmpty 进行测试 Navigation
  • Rails uglifier 应该 uglify (mangle) 函数名称吗?

    我的 js 文件被压缩并且变量被破坏 但函数名称在 Heroku 上没有被破坏 运行最新的 Rails 3 2 8 和最新的 uglify 1 3 0 gem 根据https github com lautis uglifier usage
  • 卡夫卡消费者寻求开始

    我没有使用分区来发布到 Kafka 主题 ProducerRecord 字符串主题 K键 V值 在消费者方面 我想从头开始 eekToBeginning 集合分区 是否可以在不使用分区的情况下寻求开始 Kafka 是否分配默认分区 http
  • 如何使 qtip 工具提示随光标移动

    我正在使用 js 库 qtip 工具提示 当我将鼠标悬停在表格中的悬停行上时 我想让 qtip 工具提示随光标移动 我知道如何让我自己的工具提示随光标移动 但我在使用 qtip 时遇到了困难 请解释您回答的代码 谢谢 My html tab
  • 类型转换为布尔值

    有人可以解释一下为什么会这样吗 var dump bool 1 2 returns bool true but var dump 1 2 returns bool false 当然第二次返回是正确的 但是为什么第一次 php 返回一个意外的
  • 黑客已将内容添加到我的 PHP 文件中 [已关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的网站已被黑客拿下 浏览该网站会发现每个 PHP 文件的顶部都有大量附加内容 现在每个文件都以以下内容开头 GLOBAL wehaveitagain
  • 在 .js.erb 文件中使用 $(this) - Ruby on Rails AJAX

    我正在使用 Rails3 和 jQuery 并尝试执行简单的 ajax 调用 我有一个显示应用程序当前状态 在线 离线 的链接 单击后 它将更新状态 link to app status controller gt apps action
  • 如何在conda中管理两个pip版本?

    我正在 Windows 中使用 conda 我不小心安装了两个版本的 pip 使用python m pip install upgrade pip 现在当我跑步时conda list来自基础环境 While pip version给出点 1
  • 实体框架 - 使用 order by 和 group by 的 Linq 查询

    I have Measurement具有相关属性的对象CreationTime 日期时间 和Reference 字符串 和一些其他值 我想编写一个高效的 linq 查询DbContext that 分组我的Measurement给定的对象R
  • 在 eclipse 2.0 的 aws 工具包中承担/切换角色

    我正在使用适用于 eclipse 2 0 的 aws 工具包 使用选项 窗口 gt 首选项 gt aws 工具包 我已经配置了 IAM 登录用户 api 访问密钥 id 和秘密访问密钥 根据我们的 aws 配置 此 IAM 用户必须承担角色
  • 如何在 PHP 中查找图像是否存在或渲染正常?

    我遇到这种情况 我有一些图片 http www example com test1 jpg http www example com test2 jpg http www example com test3 jpg 其中一些可能是死链接 图
  • Spark:将 RDD 结果写入文件系统很慢

    我正在使用 Scala 开发 Spark 应用程序 我的应用程序仅包含一项需要改组的操作 即cogroup 它在合理的时间完美运行 我面临的问题是当我想将结果写回文件系统时 由于某种原因 它比运行实际程序花费的时间更长 起初 我尝试在不重新
  • 检查正在运行的程序中是否存在内存泄漏

    出于好奇 我有一个关于检查内存泄漏的问题 作为一个用过的人valgrind在过去的一两年里 我经常检查代码中的内存泄漏 我突然想到它只检测丢失 未释放的内存来世之后的程序 因此 鉴于此 我在想如果你有一个长期运行的程序malloc 是间歇性
  • C 中允许重复的 const 限定符,但 C++ 中不允许?

    示例代码片段 const const const int x 10 int main 在 C 中编译 但在 C 中不编译 为什么用C编译 我认为这在 C 中也会失败 没关系 C 标准的哪一部分禁止使用重复项constC 标准的哪一部分允许这
  • 如何对 fgets 使用 feof 和ferror(C 中的 minishell)[重复]

    这个问题在这里已经有答案了 我已经编写了这个 minishell 但我不确定我是否对错误进行了正确的控制 我知道 fgets 可以返回 feof 和ferror http www manpagez com man 3 fgets http
  • spring事务超时可配置

    我有一个具有固定超时的事务方法 有没有一种方法可以通过即配置来配置事务超时application yml Transactional propagation Propagation REQUIRED timeout TIMEOUT publ