lukas-krecan / ShedLock

Distributed lock for your scheduled tasks

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

More "Kotlin Gotchas" with abstract classes

lathspell opened this issue · comments

I have some trouble with the ShedLock 4.43.0 in combination with Kotlin 1.7.22 and SpringBoot 2.7.6 (all latest versions) and JRE 11. The description in "Kotlin gotchas" in the documentation says "If @scheduled annotation is not present, you have to open the method by yourself." - In my case the annotation was present but I still had to open the methods manually. This was necessary because the methods were in an "abstract class" but the @scheduled in the derived class.

Maybe it's worth mentioning in the Gotchas section.

My example is in https://github.com/lathspell/spring_kotlin_abstract_bug and roughly:

  class Foo(something: Something): AbstractFoo(something) {
    @Scheduled...
    @SchedulerLock...
    fun cronjob() {...}
  }

  class AbstractFoo(private val something: Something) {
     fun save() { // here "something" is NULL although defined as not-nullable!
  }

Originally I wanted to report this as a but to the "kotlin-spring" or Kotlin "all-open" plugin but then I noticed that the problem
only occurs when using the @SchedulerLock annotation.

Can you elaborate why this breaks the Spring CGI-proxy stuff? Is there maybe something that ShedLock could do better?

It's pretty nasty when you have a working project, then add ShedLock and suddenly NullPointerExceptions turn up!

Hi, thanks for feedback. The reason is simple. @Scheduled does not require AOP, Spring just needs to call the method. For @SchedulerLock to work, you need AOP and Spring either has to generate a subclass or generate a proxy. I will try to update the documentation.