Spring 作业启动器无法访问服务
Spring job launcher not able to access services
你好还在学习希望有人能填空
我有 JSVC quartz spring 批处理系统,已经 运行ning 一年多了。作业启动器需要连接到在系统其他部分成功 运行 的 2 个 spring 服务。每个服务都有许多 sql 个存储库或注入其中的服务。
请注意包装声明。对于应用程序上下文条目。
package com.mycompany.business.services.impl;
....
@Service
public class BatchProcessService {
private final DomainSepcificRepository1 rep1;
...
private final DomainSepcificRepositoryN repN;
@Inject
public BatchProcessService(Final final DomainSepcificRepository1 rep1,..., final DomainSepcificRepositoryN repN) {
// injected values assigned to instance variables.
}
public List <...> findByCriteria(.....)(
.....
}
}
和
package com.mycompany.business.services.impl;
....
@Service
public class EmailNotificationServiceImpl implements EmailNotificationService {
private UserService userService;
private final MailMessage mailMessage;
private final MailTransport mailTransport;
@Inject
public EmailNotificationServiceImpl(final UserService userService, final MailMessage mailMessage, final MailTransport mailTransport) {
this.userService = userService;
this.mailMessage = mailMessage;
this.mailTransport = mailTransport;
}
.....
public void notifySupportStaff(....){
.....
}
}
在我的应用程序上下文 xml 文件中,有以下行应该允许我的作业启动器查看并实例化上述服务。我认为 "base-package=" 指定要查找可以注入的@services、@components 和@repositories 的包。
<context:component-scan base-package="com.mycompany.common.batch, com.mycompany.batch, com.mycompany.business.services" >
<context:exclude-filter type="assignable" expression="com.mycompany.common.batch.scheduler.service.MyCompanySchedulerService"/>
</context:component-scan>
- 我认为@Component 应该允许此 class 查看服务并实例化它们以及它们拥有的任何依赖项(其他服务)。
- 出于某种原因,jsvc 系统只想使用 NO arg 构造函数调用下面的 class。而且它没有注入 2 项服务。
- 仅当我为 MOCK 服务提供 2 个参数的构造函数时,我的单元测试才能测试使用该服务的方法。
lll
有没有想过为什么批处理系统不能注入依赖?
package com.mycompany.batch.scheduler;
....
@Inject
private BatchProcessService batchProcessService;
@Inject
private EmailNotificationService emailNotificationService;
@Component
public class MyCompanySchedulerJobLauncher extends SchedulerJobLauncher {
public MyCompanySchedulerJobLauncher() {
super();
}
// @Inject
public MyCompanySchedulerJobLauncher(final BatchProcessService batchProcessService, final EmailNotificationService emailNotificationService) {
super();
this.batchProcessService = batchProcessService;
this.emailNotificationService = emailNotificationService;
}
@Override
public int processJob(final JobExecutionContext context) throws JobRestartException, JobExecutionAlreadyRunningException, ParseException {
......
if(batchProcessSerive.findByCriteria(....).size() == 0) {
emailNotificationService.notifySupport(...)
}
}
好吧,我不觉得自己很傻。
问题是在我假设 could/would 注入依赖项的时候。应用程序上下文是私有的。一旦我使我的应用程序上下文受到保护并获得服务。全部工作
你好还在学习希望有人能填空
我有 JSVC quartz spring 批处理系统,已经 运行ning 一年多了。作业启动器需要连接到在系统其他部分成功 运行 的 2 个 spring 服务。每个服务都有许多 sql 个存储库或注入其中的服务。 请注意包装声明。对于应用程序上下文条目。
package com.mycompany.business.services.impl;
....
@Service
public class BatchProcessService {
private final DomainSepcificRepository1 rep1;
...
private final DomainSepcificRepositoryN repN;
@Inject
public BatchProcessService(Final final DomainSepcificRepository1 rep1,..., final DomainSepcificRepositoryN repN) {
// injected values assigned to instance variables.
}
public List <...> findByCriteria(.....)(
.....
}
}
和
package com.mycompany.business.services.impl;
....
@Service
public class EmailNotificationServiceImpl implements EmailNotificationService {
private UserService userService;
private final MailMessage mailMessage;
private final MailTransport mailTransport;
@Inject
public EmailNotificationServiceImpl(final UserService userService, final MailMessage mailMessage, final MailTransport mailTransport) {
this.userService = userService;
this.mailMessage = mailMessage;
this.mailTransport = mailTransport;
}
.....
public void notifySupportStaff(....){
.....
}
}
在我的应用程序上下文 xml 文件中,有以下行应该允许我的作业启动器查看并实例化上述服务。我认为 "base-package=" 指定要查找可以注入的@services、@components 和@repositories 的包。
<context:component-scan base-package="com.mycompany.common.batch, com.mycompany.batch, com.mycompany.business.services" >
<context:exclude-filter type="assignable" expression="com.mycompany.common.batch.scheduler.service.MyCompanySchedulerService"/>
</context:component-scan>
- 我认为@Component 应该允许此 class 查看服务并实例化它们以及它们拥有的任何依赖项(其他服务)。
- 出于某种原因,jsvc 系统只想使用 NO arg 构造函数调用下面的 class。而且它没有注入 2 项服务。
- 仅当我为 MOCK 服务提供 2 个参数的构造函数时,我的单元测试才能测试使用该服务的方法。 lll
有没有想过为什么批处理系统不能注入依赖?
package com.mycompany.batch.scheduler;
....
@Inject
private BatchProcessService batchProcessService;
@Inject
private EmailNotificationService emailNotificationService;
@Component
public class MyCompanySchedulerJobLauncher extends SchedulerJobLauncher {
public MyCompanySchedulerJobLauncher() {
super();
}
// @Inject
public MyCompanySchedulerJobLauncher(final BatchProcessService batchProcessService, final EmailNotificationService emailNotificationService) {
super();
this.batchProcessService = batchProcessService;
this.emailNotificationService = emailNotificationService;
}
@Override
public int processJob(final JobExecutionContext context) throws JobRestartException, JobExecutionAlreadyRunningException, ParseException {
......
if(batchProcessSerive.findByCriteria(....).size() == 0) {
emailNotificationService.notifySupport(...)
}
}
好吧,我不觉得自己很傻。 问题是在我假设 could/would 注入依赖项的时候。应用程序上下文是私有的。一旦我使我的应用程序上下文受到保护并获得服务。全部工作