как внедрить службу в поток, созданный через службу executor весной - PullRequest
0 голосов
/ 04 марта 2019

Я создал простой сервис, такой как ..., где я должен получить некоторые данные из базы данных позже

package com.spring.scheduler.example.springscheduler;

import org.springframework.stereotype.Service;

@Service
public class ExampleService {

    private String serviceName;
    private String repository;

    public String getServiceName() {
        return serviceName;
    }
    public void setServiceName(String serviceName) {
        this.serviceName = serviceName;
    }
    public String getRepository() {
        return repository;
    }
    public void setRepository(String repository) {
        this.repository = repository;
    }
}

Вот мой планировщик задач, созданный для запуска различных потоков.

@Component
public class TaskSchedulerService {

    @Autowired 
    ThreadPoolTaskScheduler threadPoolTaskScheduler;
     public ScheduledFuture<?> job1;        
     public ScheduledFuture<?> job2;

     @Autowired 
    ApplicationContext applicationContext;


     @PostConstruct
     public void job1() {
         //NewDataCollectionThread thread1 = new NewDataCollectionThread();
         NewDataCollectionThread thread1 = applicationContext.getBean(NewDataCollectionThread.class);
         AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
         factory.autowireBean(thread1);
         factory.initializeBean(thread1, null);
         job1 = threadPoolTaskScheduler.scheduleAtFixedRate(thread1, 1000);
     }

 }

Это поток пытается вызвать из планировщика.Я пытался принудительно создать экземпляр службы с помощью контекста приложения, но он не был создан.

@Configurable
@Scope("prototype")
public class NewDataCollectionThread implements Runnable {

private static final Logger LOGGER = 
LoggerFactory.getLogger(NewDataCollectionThread.class);

@Autowired
private ExampleService exampleService;

@Override
public void run() {
    LOGGER.info("Called from thread : NewDataCollectionThread");
    System.out.println(Thread.currentThread().getName() + " The Task1 
    executed at " + new Date());
    try {
        exampleService.setRepository("sdasdasd");
        System.out.println("Service Name :: " + 
        exampleService.getServiceName());
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

}

Пожалуйста, предложите возможные пути его достижения.

1 Ответ

0 голосов
/ 04 марта 2019

Попробуйте что-то вроде этого:

@Autowired 
private AutowireCapableBeanFactory beanFactory;

@PostConstruct
public void job1() {
    NewDataCollectionThread thread1 = new NewDataCollectionThread();
    beanFactory.autowireBean(thread1);
    job1 = threadPoolTaskScheduler.scheduleAtFixedRate(thread1, 1000);
}

В NewDataCollectionThread я успешно ввел службу примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...