Java ScheduledExecutorService只执行生产者线程一次
Java ScheduledExecutorService只执行生产者线程一次,java,multithreading,spring-boot,Java,Multithreading,Spring Boot,ScheduledExecutorService预计每秒执行一次Producer,初始延迟为2秒 服务 public ScheduledExecutorService writeTimestampPeriodically() { executorService = Executors.newScheduledThreadPool(3); scheduleAtFixedRate(Producer.class); return executorService; } @Slf
ScheduledExecutorService
预计每秒执行一次Producer
,初始延迟为2秒
服务
public ScheduledExecutorService writeTimestampPeriodically() {
executorService = Executors.newScheduledThreadPool(3);
scheduleAtFixedRate(Producer.class);
return executorService;
}
@Slf4j
@Component
public class Queue {//...}
@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);
}
制作人
@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();
}
public interface Actor extends Runnable {
}
AbstractActor
@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();
}
public interface Actor extends Runnable {
}
演员
@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();
}
public interface Actor extends Runnable {
}
application.yml
app:
actor:
producer:
initial-delay: 2s
period: 1s
更新: 似乎Spring没有正确地自动连接
队列
,因为它是空的
移动的
@Autowired
protected Queue queue;
到制作人
没有帮助
队列
public ScheduledExecutorService writeTimestampPeriodically() {
executorService = Executors.newScheduledThreadPool(3);
scheduleAtFixedRate(Producer.class);
return executorService;
}
@Slf4j
@Component
public class Queue {//...}
@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);
}
更新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的
FactoryBean
和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);
}
}
ActorService
public ScheduledExecutorService writeTimestampPeriodically() {
executorService = Executors.newScheduledThreadPool(3);
scheduleAtFixedRate(Producer.class);
return executorService;
}
@Slf4j
@Component
public class Queue {//...}
@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);
}
@Autowired
ActorFactoryConfig ActorFactoryConfig;
@自动连线
私营工厂;
private void scheduleAtFixedRate(类看起来像Spring的工厂bean
和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);
}
}
ActorService
public ScheduledExecutorService writeTimestampPeriodically() {
executorService = Executors.newScheduledThreadPool(3);
scheduleAtFixedRate(Producer.class);
return executorService;
}
@Slf4j
@Component
public class Queue {//...}
@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);
}
@Autowired
ActorFactoryConfig ActorFactoryConfig;
@自动连线
私营工厂;
private void scheduleAtFixedRate(类你能检查它在执行过程中是否抛出错误吗?没有错误或异常。只有log.info(“produred{}”,timestamp)
中的一条日志记录,你可以在run
方法的整个过程中进行尝试/捕获吗?没有任何上下文,我唯一的猜测是queue.put(timestamp)
抛出了一个异常。你能检查一下它在执行过程中是否抛出了一个错误吗?没有错误或异常。只有log.info(“生成的{}”,timestamp)
中的一条日志记录,然后你对run
方法的整个过程进行了尝试/捕获。没有更多的上下文,我唯一的猜测是queue.put(timestamp);
引发了一个异常。