通常,我们可以通过在*-items.xml
和*-spring.xml
中定义配置来创建CronJobs和Jobs(扩展了AbstractJobPerformable)。但是,我无法获得这些作业来访问Web上下文中的bean。我可以在网络环境中创建CronJob和Job吗?如果是,怎么办?
我需要作业在Web上下文中工作的原因是我需要访问ehcache并对其进行操作。
答案 0 :(得分:0)
您不需要在Web上下文中创建作业。为此工作创建一个自己的扩展名,并为您的Facades扩展名创建一个依赖项。
答案 1 :(得分:0)
如果您想继续使用默认的cronJobService
来运行作业,那么唯一的解决方案可能就是“正确地”访问所需的Web上下文。
示例groovy脚本以按名称访问Web应用程序上下文。
import org.springframework.cache.ehcache.EhCacheCacheManager
import org.springframework.web.context.ContextLoader
final String WEB_CONTEXT_NAME = "/rest"
def contextLoader = ContextLoader.currentContextPerThread.find { it.key.contextName == WEB_CONTEXT_NAME }
assert contextLoader != null
def webApplicationContext = contextLoader.value
webApplicationContext.getBean(EhCacheCacheManager)
请记住,ContextLoader.currentContextPerThread
是一个私有字段。要访问Java中的字段,您可以使用
def f = ContextLoader.getDeclaredField("currentContextPerThread");
f.setAccessible(true);
Map<ClassLoader, WebApplicationContext> contexts = f.get(HybrisContextLoaderListener);
JobPerformable示例看起来像
public class WebContextAwareJob extends AbstractJobPerformable<CronJobModel> {
@Override
public PerformResult perform(final CronJobModel cronJobModel) {
final CacheManager cacheManager = getEhCacheManager().getCacheManager();
final Cache cache = cacheManager.getCache("");
}
private EhCacheCacheManager getEhCacheManager() {
return getRegistry().getBean(EhCacheCacheManager.class)
}
private WebApplicationContext getRegistry() {
<see sample code above>
}
}