[英]ScheduledExecutorService executes Producer thread only once
ScheduledExecutorService
预计每秒执行一次Producer
,初始延迟为 2 秒。
服务
public ScheduledExecutorService writeTimestampPeriodically() {
executorService = Executors.newScheduledThreadPool(3);
scheduleAtFixedRate(Producer.class);
return executorService;
}
制片人
@Slf4j
public class Producer extends AbstractActor {
public Producer(String name) {
super(name);
}
@Override
public void run() {
Thread.currentThread().setName(name);
Timestamp timestamp = Timestamp.from(Instant.now());
log.info("Produced {}", timestamp);
queue.put(timestamp);
}
}
抽象演员
@RequiredArgsConstructor
public abstract class AbstractActor implements Actor, Runnable {
protected final String name;
@Autowired
protected Queue queue;
@Autowired
protected TimestampService timestampService;
}
演员
public interface Actor extends Runnable {
@Override
void run();
}
应用程序.yml
app:
actor:
producer:
initial-delay: 2s
period: 1s
更新:
似乎 Spring 没有正确自动连接queue
,因为它是 null。
移动
@Autowired
protected Queue queue;
对Producer
没有帮助。
队列
@Slf4j
@Component
public class Queue {//...}
更新 2
我认为问题出在使用new
创建Producer
的工厂的实施中
@Component
public class ActorFactory {
public Actor create(String name) {
if (name.indexOf("consumer") == 0)
return new Consumer(name);
else if (name.indexOf("producer") == 0)
return new Producer(name);
else if (name.indexOf("monitor") == 0)
return new Monitor(name);
else
throw new UnsupportedOperationException("Actor Factory cannot create " + name);
}
}
似乎 Spring 的Factory Beans
和AbstractFactoryBean
在我的情况下无济于事,所以我这样解决了:
ActorFactoryConfig
@Configuration
public class ActorFactoryConfig {
@Bean
public ActorFactory<String, Actor> actor() {
return this::create;
}
@Bean
@Scope(value = "prototype")
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Actor create(String name) {
if (name.indexOf("consumer") == 0)
return new Consumer(name);
else if (name.indexOf("producer") == 0)
return new Producer(name);
else if (name.indexOf("monitor") == 0)
return new Monitor(name);
else
throw new UnsupportedOperationException("Actor Factory cannot create " + name);
}
}
演员工厂
@FunctionalInterface
public interface ActorFactory<String, Actor> {
Runnable apply(String name);
}
演员
public interface Actor extends Runnable {
}
演员服务
@Autowired
ActorFactoryConfig actorFactoryConfig;
@Autowired
private ActorFactory actorFactory;
private void scheduleAtFixedRate(Class<? extends Actor> actorType) {
executorService.scheduleAtFixedRate(
actorFactoryF.apply(actorType.getSimpleName().toLowerCase() + "-1"),
getProperty(actorType, SETTING_TYPE.DELAY),
getProperty(actorType, SETTING_TYPE.PERIOD),
TimeUnit.SECONDS);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.