在Spring引导应用程序中实现辅助进程

在Spring引导应用程序中实现辅助进程,spring,spring-boot,heroku,spring-data-mongodb,worker,Spring,Spring Boot,Heroku,Spring Data Mongodb,Worker,简介 我目前通过Heroku在一个web dyno上运行Spring Boot应用程序。由于大量密集的后台任务(从第三方API获取资源、发送邮件等),我希望将所有这些“繁重的工作”转移到第二个worker dyno/进程上。但是,在将应用程序组件(例如@Repositories)正确地公开给第二个工作进程时,我面临着一些困难 我到目前为止所做的尝试 我已经创建了第二个主类(BackgroundWorker),我在Procfile中将其指定为工作进程。然后调用以下类以初始化后台任务 @Servic

简介

我目前通过Heroku在一个web dyno上运行Spring Boot应用程序。由于大量密集的后台任务(从第三方API获取资源、发送邮件等),我希望将所有这些“繁重的工作”转移到第二个worker dyno/进程上。但是,在将应用程序组件(例如@Repositories)正确地公开给第二个工作进程时,我面临着一些困难

我到目前为止所做的尝试

我已经创建了第二个主类(
BackgroundWorker
),我在Procfile中将其指定为工作进程。然后调用以下类以初始化后台任务

@Service
@EnableMongoRepositories("com.a.viz.db")
@ComponentScan("com.a.viz.db")
@EntityScan("com.a.viz.model")
public class TaskHandler {
    @Autowired
    UProductRepository productRepository;

    public void initScheduler()
    {
        Runnable fetchProducts = () -> {
            Scheduler.fetchProducts(productRepository);
        };
    }
}
虽然主类如下所示:

public class BackgroundWorker {
    static Logger logger =  LoggerFactory.getLogger(BackgroundWorker.class);

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.scan("com.a.viz.workers");
        context.refresh();
        TaskHandler handler = context.getBean(TaskHandler.class);
        handler.initScheduler();
    }
}
运行上述代码片段后,我得到了bean
MongoTemplate
的一个不满意的依赖项错误,我将它注入到
UProductRepository
的具体实现中,称为
UProductRepositoryImpl

public class UProductRepositoryImpl implements UProductRepositoryCustom {
    private final MongoTemplate mongoTemplate;

    @Autowired
    public UProductRepositoryImpl(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }
}
org.springframework.beans.factory.NoSuchBean定义异常:没有类型为“org.springframework.data.mongodb.core.MongoTemplate”的合格bean

如何将
MongoTemplate
公开给第二个辅助进程?此外,什么是处理类似问题的好方法?我是否应该尝试组织我的组件,以便只有相关的组件暴露于工作进程?谢谢你的关注

解决方案 由于工作进程还必须是一个Spring应用程序(为了允许注入存储库等),因此必须初始化其应用程序上下文。web参数用于防止设置正确的web服务器,因为这不是必需的

// Other configs..
@EnableAutoConfiguration
public class BackgroundWorker implements ApplicationRunner {

    @Autowired
    // Repositories..

    public static void main(String[] args)
    {
        new SpringApplicationBuilder(BackgroundWorker.class)
                .web(WebApplicationType.NONE)
                .run(args);
    }