可检索批注在spring批处理应用程序中不起作用
这是我的班级,我叫一个服务。 这是我正在绑定的代码 我还启用了类级别的重试。 为了使这项工作顺利进行,我还需要做些什么吗 这是我的生产spring应用程序。上面的一个正是我试图在本地运行的地方可检索批注在spring批处理应用程序中不起作用,spring,spring-batch,Spring,Spring Batch,这是我的班级,我叫一个服务。 这是我正在绑定的代码 我还启用了类级别的重试。 为了使这项工作顺利进行,我还需要做些什么吗 这是我的生产spring应用程序。上面的一个正是我试图在本地运行的地方 @Retryable(maxAttempts=2 ,value=NotFoundException.class,backoff = @Backoff(delay = 10000,multiplier=2)) private boolean extractVesselDetailsFromSOL(Strin
@Retryable(maxAttempts=2 ,value=NotFoundException.class,backoff = @Backoff(delay = 10000,multiplier=2))
private boolean extractVesselDetailsFromSOL(String imoNumber) {
try{
Entity result = nameMatcherRestClient.getEntity(VESSEL_PREFIX + imoNumber);
if (result != null) {
addVesselDetailsToMap(result, imoNumber);
addAssociateDetailsToMap(result, imoNumber);
}
}catch(NotFoundException e){
LOGGER.error("Exception in extractVesselDetailsFromSOL :: "+e.getMessage());
LOGGER.error("Exception in extractVesselDetailsFromSOL :: "+Count++);
System.out.println("NameMatcher --> " + Count++);
return false;
}
return true;
}
这就是我调用上述方法的地方
private boolean getVesselDetails(String imoNumber){
return ((!vesselDetailsFromSol.containsKey(imoNumber)) && (!extractVesselDetailsFromSOL(imoNumber)));
}
看到您更新的问题,我想我知道问题是什么:您正在从同一个bean中调用
extractVesselDetailsFromSOL
(这是一个私有方法)@需要从不同的bean调用可重试的方法,以便AOP(重试)功能可以启动。您应该将代码重构为如下内容:
public class SomeBean {
@Autowired
private SomeOtherBean someOtherBean;
public someOperation() {
...
someOtherBean.extractVesselDetailsFromSOL(xxx);
}
}
public class SomeOtherBean {
@Retryable(maxAttempts=2 ,value=NotFoundException.class,backoff = @Backoff(delay = 10000,multiplier=2))
public boolean extractVesselDetailsFromSOL(String imoNumber) {
try{
Entity result = nameMatcherRestClient.getEntity(VESSEL_PREFIX + imoNumber);
if (result != null) {
addVesselDetailsToMap(result, imoNumber);
addAssociateDetailsToMap(result, imoNumber);
}
}catch(NotFoundException e){
LOGGER.error("Exception in extractVesselDetailsFromSOL :: "+e.getMessage());
LOGGER.error("Exception in extractVesselDetailsFromSOL :: "+Count++);
System.out.println("NameMatcher --> " + Count++);
return false;
}
return true;
}
}
:
由于Spring的AOP框架基于代理的特性,在
根据定义,目标对象未被拦截。对于JDK代理,
只能拦截代理上的公共接口方法调用。
使用CGLIB,代理上的公共和受保护方法调用将
拦截,甚至在必要时打包可见的方法。然而,
通过代理进行的公共交互应始终通过
公开签名
请注意,切入点定义通常与任何
拦截方法。如果一个切入点是严格意义上的公开,
即使在具有潜在非公开交互的CGLIB代理场景中
通过代理,需要相应地定义它
如果您的拦截需要包括方法调用甚至构造函数
在目标类中,考虑使用弹簧驱动的本机。
AspectJ编织代替了Spring基于代理的AOP框架。这
以不同的方式构成不同的AOP使用模式
特点,所以一定要熟悉编织
在做决定之前先做决定
与您有相同问题的人和解决方案是我在上面展示的:使该功能从一个bean可用并从另一个bean调用。这看起来不像Spring应用程序:您正在实例化NameProcessor类,而不是从应用程序中将其作为bean调用context@codependent我写这篇文章是为了在本地测试它,因为我不能在这里放置完整的工作类。如果你想,我可以放置特定的方法,但这会有帮助吗?对不起,我没有得到不同的bean方法?我已经更新了调用我的方法的位置