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.

Tags:

Java

Spring