How to start a daemon on server startup in spring
my english is pool. you must set the Service Class @Lazy(false).
Have you added the <annotation-driven>
tag to your application context? From the Spring reference doc:
To enable both @Scheduled and @Async annotations, simply include the 'annotation-driven' element from the task namespace in your configuration.
Note, you should also consider to configure an executor instance. From the task schema definition:
Defines a ThreadPoolTaskExecutor instance with configurable pool size, queue-capacity, keep-alive, and rejection-policy values. See Javadoc for the org.springframework.scheduling.annotation.EnableAsync annotation for information on code-based alternatives to this XML element.
So to create an executor that is backed up by a thread pool with 5 threads you have to do the following:
<task:annotation-driven executor="myExecutor"/>
<task:executor id="myExecutor" pool-size="5"/>
For more configuration options, see the @EnableAsync javadoc as stated above.
First of all You don't need to implement ApplicationListener
interface. You are working with Spring - Application context is enough.
Second you are talking about Spring @Async
, it means that your task should be started from Application Context and Controller bean is a part of it.
You need to make sure that you have <annotation-driven>
in your spring xml file.
You can start your task on @PostConstruct function:
@Component
public class SampleBeanImpl implements SampleBean {
@Async
void doSomething() { … }
}
@Component
public class SampleBeanInititalizer {
@Autowired
private final SampleBean bean;
@PostConstruct
public void initialize() {
bean.doSomething();
}
}
Based on Spring's reference, use of @Async
has limitations during start-up of the application:
@Async
can not be used in conjunction with lifecycle callbacks such as@PostConstruct
. To asynchronously initialize Spring beans you currently have to use a separate initializing Spring bean that invokes the@Async
annotated method on the target then.
So, in your case, maybe it'd be good to have an InitializingBean
implementation with your target bean and then start the daemon through that.