1

Я бег приложения Spring загрузки, я настроил в моем App класса конфигурации:Autowire или Inject Bean в Running нити

@Bean 
public ThreadPoolTaskExecutor taskExecutor() { 
    ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); 
    pool.setCorePoolSize(5); 
    pool.setMaxPoolSize(10); 
    pool.setWaitForTasksToCompleteOnShutdown(true); 
    return pool; 
} 

Я создаю мою нить TaskExecutor таким образом:

@Configuration 
public class ProducerConsumer { 
@Inject 
TaskExecutor taskExecutor; 


    Producer producer = new Producer(sharedQueue); 
    Consumer consumer = new Consumer(sharedQueue); 

    taskExecutor.execute(producer); 
    taskExecutor.execute(consumer); 

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

@Component 
public class Consumer implements Runnable { 

@Autowired 
SomeController someController; 

public Consumer (BlockingQueue<String> sharedQueue) { 
    this.sharedQueue = sharedQueue; 
} 

@Override 
public void run() { 
    while (true) { 
     synchronized (sharedQueue) { 
      //someController is null 
      someController.someMethod(); 

Как я могу представить свою нить в контексте приложения, чтобы я мог вставлять любые другие зависимости в мой поток?

ответ

2

Они приходят как null, потому что вы сами их создаете, используя new, сглаживают lettinng Spring, создавая их. Если вы сами строите объект, Spring не знает об этом и, таким образом, не может автоувеличивать что-либо. Построенные объекты - это обычные объекты, а не весна.

Определите общую очередь в виде Spring-компонента, вставьте общую очередь у потребителя и производителя и введите потребителя и производителя в ProducerConsumer.

Или введите SomeController в ProducerConsumer и передайте его как аргумент конструктору Потребителя и Продюсера.

Смежные вопросы