繁体   English   中英

ScheduledExecutorService 只执行一次 Producer 线程

[英]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 BeansAbstractFactoryBean在我的情况下无济于事,所以我这样解决了:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM