Spring Retry是否可以保证与Spring的@Transactional注释一起使用?
具体来说,我正在尝试使用@Retryable乐观锁定.似乎它将依赖于创建的AOP代理的顺序.例如,如果调用如下所示:
调用代码 - >重试代理 - >事务代理 - >实际数据库代码
然后它将正常工作,但如果代理结构如下:
调用代码 - >事务代理 - >重试代理 - >实际数据库代码
然后重试将不起作用,因为关闭事务的行为是抛出optmistic锁定异常的行为.
在测试中,它似乎生成了第一个案例(重试,然后交易),但我不知道这是保证行为还是幸运.
在过去,我已经通过安全策略文件启动了jstatd,如下所示:https: //stackoverflow.com/a/14930180/1294116
但是,在Java 9+中,他们已经删除了该tools.jar文件,这意味着此解决方案不再有效.有谁知道怎么解决这个问题?(目前我回来收到错误java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") ...)
我的理解是,当您使用Spring Cloud的RefreshScope注释时,会注入数据的代理,如果更改了支持信息,代理会自动更新.不幸的是,我需要找到一种方法,以便在刷新时发出警报,以便我的代码可以重新读取刷新范围的bean中的数据.
简单示例:计划任务,其计划存储在Cloud Config中.除非你等到下一次执行任务(可能需要一段时间)或定期轮询配置(这看起来很浪费),否则无法知道配置是否已更改.
简短版本:我需要在Java中找到一种方法来定位Method调用堆栈中的前一个(注意方法中的大写'M' - 我需要实际的java.lang.reflect.Method对象).
背景:我正在研究Google Guava Preconditions.checkNotNull(...)概念的扩展,它允许程序员同时检查所有参数是否为null,并根据调用方法的参数名称构造NPE.例如:
public class MyClass
{
public void myMethod(Object arg1, Integer arg2, String arg3)
{
MyPreconditions.checkAllNotNull(arg1, arg2, arg3);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果第一个参数为null,那么NPE可能会读取 arg1 cannot be null (MyClass:myMethod(Object, Integer, String)
我已经解决了如何获得调用Class,我可以通过Spring LocalVariableTableParameterNameDiscoverer(或通过Paranamer库)得到参数名称Method.我无法弄清楚的唯一部分是如何获得Method自己.
我知道您可以使用堆栈跟踪来获取方法名称,但如果重写该方法,则无效.有没有办法(即使是内部的com.sun类)来获得实际的堆栈?或者,我可以获取调用方法的行号,那么有没有办法找到Method从Class对象中检索的a的行号?
我正在尝试为使用@RefreshScope. 我想添加一个实际更改属性并断言应用程序正确响应的测试。我已经想出了如何触发刷新(自动装配RefreshScope和调用refresh(...)),但我还没有想出修改属性的方法。如果可能,我想直接写入属性源(而不是必须处理文件),但我不确定在哪里查看。
更新
这是我正在寻找的示例:
public class SomeClassWithAProperty {
@Value{"my.property"}
private String myProperty;
public String getMyProperty() { ... }
}
public class SomeOtherBean {
public SomeOtherBean(SomeClassWithAProperty classWithProp) { ... }
public String getGreeting() {
return "Hello " + classWithProp.getMyProperty() + "!";
}
}
@Configuration
public class ConfigClass {
@Bean
@RefreshScope
SomeClassWithAProperty someClassWithAProperty() { ...}
@Bean
SomeOtherBean someOtherBean() {
return new SomeOtherBean(someClassWithAProperty());
}
}
public class MyAppIT {
private static final DEFAULT_MY_PROP_VALUE = "World";
@Autowired
public …Run Code Online (Sandbox Code Playgroud) java ×5
spring ×3
spring-cloud ×2
java-9 ×1
jstatd ×1
reflection ×1
spring-boot ×1
spring-data ×1
spring-retry ×1