'Hazelcast creates spring beans without dependencies
This happens inside an application that runs in a Kubernetes cluster, built using spring boot. The instances of the application form an embedded hazelcast cluster. There is no client of that cluster outside of the application.
A class implementing Runnable that depends on some injected beans, is scheduled on a hazelcast executor. After its initial execution, a different instance than the original is used - and its dependencies are not filled in.
The class:
@SpringAware
@Component
public class RunnableClass implements Runnable, Serializable {
private OneSpringBean dependency1;
private AnotherSpringBean dependency2;
@Autowired
public RunnableClass(OneSpringBean dependency1, AnotherSpringBean dependency2, IScheduledExecutorService scheduler) {
this.dependency1 = dependency1;
this.dependency2 = dependency2;
LOGGER.debug("[CONSTRUCTOR] Runnable class itself: {}", this);
LOGGER.debug("[CONSTRUCTOR] Runnable dependency1: {}", this.dependency1);
LOGGER.debug("[CONSTRUCTOR] Runnable dependency2: {}", this.dependency2);
scheduler.scheduleAtFixedRate(this, 0L, 60, TimeUnit.SECONDS);
}
@Override
public void run() {
LOGGER.debug("[RUN] Runnable class itself: {}", this);
LOGGER.debug("[RUN] Runnable dependency1: {}", this.dependency1);
LOGGER.debug("[RUN] Runnable dependency2: {}", this.dependency2);
}
}
The relevant part of the log:
18:35:08.008 main com.some.package.RunnableClass: [CONSTRUCTOR] Runnable class itself: com.some.package.RunnableClass@4eaa375c
18:35:08.008 main com.some.package.RunnableClass: [CONSTRUCTOR] Runnable class dependency1: com.some.package.OneSpringBean@bc6288b
18:35:08.008 main com.some.package.RunnableClass: [CONSTRUCTOR] Runnable class dependency2: com.some.package.AnotherSpringBean@7235f92b
18:35:08.008 hz.quizzical_hoover.cached.thread-2 com.some.package.RunnableClass: [RUN] Runnable class itself: com.some.package.RunnableClass@4eaa375c
18:35:08.008 hz.quizzical_hoover.cached.thread-2 com.some.package.RunnableClass: [RUN] Runnable class dependency1: com.some.package.OneSpringBean@bc6288b
18:35:08.008 hz.quizzical_hoover.cached.thread-2 com.some.package.RunnableClass: [RUN] Runnable class dependency2: com.some.package.AnotherSpringBean@7235f92b
18:36:24.024 hz.quizzical_hoover.cached.thread-5 com.some.package.RunnableClass: [RUN] Runnable class itself: com.some.package.RunnableClass@199c4dee
18:36:24.024 hz.quizzical_hoover.cached.thread-5 com.some.package.RunnableClass: [RUN] Runnable class dependency1: null
18:36:24.024 hz.quizzical_hoover.cached.thread-5 com.some.package.RunnableClass: [RUN] Runnable class dependency2: null
18:46:24.024 hz.quizzical_hoover.cached.thread-3 com.some.package.RunnableClass: [RUN] Runnable class itself: com.some.package.RunnableClass@199c4dee
18:46:24.024 hz.quizzical_hoover.cached.thread-3 com.some.package.RunnableClass: [RUN] Runnable class dependency1: null
18:46:24.024 hz.quizzical_hoover.cached.thread-3 com.some.package.RunnableClass: [RUN] Runnable class dependency2: null
18:56:24.024 hz.quizzical_hoover.cached.thread-3 com.some.package.RunnableClass: [RUN] Runnable class itself: com.some.package.RunnableClass@199c4dee
18:56:24.024 hz.quizzical_hoover.cached.thread-3 com.some.package.RunnableClass: [RUN] Runnable class dependency1: null
18:56:24.024 hz.quizzical_hoover.cached.thread-3 com.some.package.RunnableClass: [RUN] Runnable class dependency2: null
As can be seen, after the construction of the bean and the initial execution of the scheduled task, a new bean is created, and all subsequent executions of the scheduled task use that new bean - i.e. a new bean is not created on each execution.
Although several instances of the application run, and form the embedded hazelcast cluster, the phenomenon can be seen on a single node. (I.e. the log excerpt above was copied from a single node.)
Why is this happening? How can it be fixed?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
