Taskana / taskana

Lightweight library for general purpose task management
https://taskana.pro
Apache License 2.0
92 stars 100 forks source link

Exception is thrown when JobRunner tries to run RefreshUserInfoJob #2229

Closed ryzheboka closed 1 year ago

ryzheboka commented 1 year ago

When JobRunner tries to run RefreshUserInfoJob using AbstractTaskanaJob.createFromScheduledJob, following code is executed:

return (TaskanaJob)
        Thread.currentThread()
            .getContextClassLoader()
            .loadClass(job.getType())
            .getConstructors()[0]
            .newInstance(engine, txProvider, job);

This is where the exception "wrong number of arguments" is thrown. .getConstructors()[0] returns the constructor of RefreshUserInfoJob that has only one attribute. However, in the next line we try to pass three atributes to the constructor. Swapping contructors in RefreshUserInfoJob prevents this exception. However, a better solution is needed so that the correct constructor is used instead of the first one.

Stack trace:

java.lang.IllegalArgumentException: wrong number of arguments at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na] at pro.taskana.common.internal.jobs.AbstractTaskanaJob.createFromScheduledJob(AbstractTaskanaJob.java:50) ~[classes/:na] at pro.taskana.common.internal.jobs.JobRunner.runScheduledJob(JobRunner.java:54) ~[classes/:na] at pro.taskana.common.internal.jobs.JobRunner.lambda$4(JobRunner.java:45) ~[classes/:na] at pro.taskana.common.internal.TaskanaEngineImpl.runAsAdmin(TaskanaEngineImpl.java:343) ~[classes/:na] at pro.taskana.common.internal.jobs.JobRunner.lambda$3(JobRunner.java:45) ~[classes/:na] at pro.taskana.common.internal.transaction.TaskanaTransactionProvider.lambda$0(TaskanaTransactionProvider.java:23) ~[classes/:na] at pro.taskana.common.internal.jobs.PlainJavaTransactionProvider.executeInTransaction(PlainJavaTransactionProvider.java:32) ~[classes/:na] at pro.taskana.common.internal.transaction.TaskanaTransactionProvider.executeInTransactionIfPossible(TaskanaTransactionProvider.java:14) ~[classes/:na] at pro.taskana.common.internal.transaction.TaskanaTransactionProvider.executeInTransactionIfPossible(TaskanaTransactionProvider.java:20) ~[classes/:na] at pro.taskana.common.internal.jobs.JobRunner.runJobTransactionally(JobRunner.java:42) ~[classes/:na] at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] at pro.taskana.common.internal.jobs.JobRunner.runJobs(JobRunner.java:32) ~[classes/:na] at pro.taskana.common.internal.jobs.JobScheduler.lambda$3(JobScheduler.java:83) ~[classes/:na] at pro.taskana.common.internal.TaskanaEngineImpl.runAsAdmin(TaskanaEngineImpl.java:343) ~[classes/:na] at pro.taskana.common.internal.jobs.JobScheduler.runAsyncJobsAsAdmin(JobScheduler.java:78)

arolfes commented 1 year ago

Hello @mustaphazorgati , @ryzheboka ,

I think I fixed the problem. But I'm not able to write a proper unit test for it. Can you give me a hint how to do that?

mustaphazorgati commented 1 year ago

Hello @mustaphazorgati , @ryzheboka ,

I think I fixed the problem. But I'm not able to write a proper unit test for it. Can you give me a hint how to do that?

I've posted a suggestion in your PR. Does that help?