在Spring引导应用程序中实现辅助进程
简介 我目前通过Heroku在一个web dyno上运行Spring Boot应用程序。由于大量密集的后台任务(从第三方API获取资源、发送邮件等),我希望将所有这些“繁重的工作”转移到第二个worker dyno/进程上。但是,在将应用程序组件(例如@Repositories)正确地公开给第二个工作进程时,我面临着一些困难 我到目前为止所做的尝试 我已经创建了第二个主类(在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
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();
}
}
运行上述代码片段后,我得到了beanMongoTemplate
的一个不满意的依赖项错误,我将它注入到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);
}