Aspect不捕获Scheduled中的方法

时间:2017-11-02 10:08:04

标签: java spring annotations scheduler spring-aop

为什么当设置为来自cron的方法时,注释的设置方面不起作用。

if (!require("forecast")){install.packages("forecast"); library(forecast)} 

train<-ts(your_data_train,frequency=24)
test<-ts(your_data_test,frequency=24)


fit1<-tslm(train ~ trend + season) #linear regression
fcast1 <- forecast(fit1,h=npred ,level = 0)

fit2<-ets(train,ic="aic") #exponencial smoothing without Box-Cox
fcast2 <- forecast(fit2,h=npred ,level = 0)

fit3<-HoltWinters(train) #Clasic Holtwinter (similar to exponencial smoothing)
fcast3 <-forecast(fit3,h=npred ,level = 0)

fit4<-HoltWinters(train,seasonal = "mult") #Holtwinter mult
fcast4 <-forecast(fit4,h=npred ,level = 0)

fit5 <- tbats(train) #Model TBATS
fcast5 <- forecast(fit5, h=npred ,level = 0)

lam <- BoxCox.lambda(train)
fit6 <- ets(train, additive=TRUE, lambda=lam) #Model exponencial smoothing with de Box.Cox
fcast6 <-forecast(fit6,h=npred,level = 0)

pred<-c(fcast1$mean,fcast2$mean,fcast3$mean,fcast4$mean,fcast5$mean,fcast6$mean)

error<-0
for(i in 1:length(pred)){
  error[i]<-mean((pred[i]-test)^2)
}

2 个答案:

答案 0 :(得分:1)

Spring AOP

以下是关于Spring AOP应该记住的几点,

  1.   

    由于Spring的AOP框架基于代理的特性,目标对象中的调用根据定义未截获

  2.   

    对于 JDK代理,只有代理上的公开接口方法调用可以拦截。使用 CGLIB 公开受保护方法调用代理将截获,甚至包 - 必要时可见方法。

  3. 您可以找到更多here

    • 由于您的方法myMethod私有,因此不会拦截对myMethod的调用。请参阅上面提到的第二点
    • 即使您的myMethod 公开,如果通过myMethod方式进行调用,也不会截获对schedule的调用。请参阅上面提到的第一点
    • 现在,如果您的myMethod 公开,如果从对象外部直接调用myMethod方法,则会拦截对myMethod的调用。

    AspectJ源编织

    但是,您可以通过利用AspectJ源编织来拦截私有方法。在源代码编织中,编织器成为编译器的一部分。 编织器通过处理源代码并生成编织的Java字节码来充当编译器。它使用javac编译器而不是ajc编译器。

    以下是您需要进行的更改:

    • 将Maven aspectj-maven-plugin插件添加到pom.xml
    • 如下所示,MyAspect切入点的更改包含私有方法。

      @Component
      @Aspect
      public class MyAspect {
      
          @Before("@annotation(myAnnoAnnotation) && execution(private * *(..))")
          public void myAnnoAspect(JoinPoint jp, MyAnno myAnnoAnnotation) {
          ...
          }
      }
      

      您可以找到完整的工作示例here

答案 1 :(得分:0)

尝试如下更改您的来源。

当然,具有main方法的应用程序类应附加@EnableScheduling。

@Component
public class MyClass {
    @MyAnno
    @Scheduled(cron = "0/5 * * * * ?")
    public void schedule() {
        myMethod("test");
    }
    private void myMethod(String text) {
        //TODO enter your code.
    }
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno{

}

@Aspect
@Component
public class MyAnnoAspect{
    @Before("@annotation(MyAnno)")
    public void myAnnoAspect(JoinPoint jp) {

    }
}