可检索批注在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

这是我的班级,我叫一个服务。 这是我正在绑定的代码

我还启用了类级别的重试。 为了使这项工作顺利进行,我还需要做些什么吗

这是我的生产spring应用程序。上面的一个正是我试图在本地运行的地方

@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方法?我已经更新了调用我的方法的位置