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);
引发了一个异常。