我可以在网络环境中创建CronJob和Job吗?

时间:2018-12-11 00:42:05

标签: ehcache jobs hybris

通常,我们可以通过在*-items.xml*-spring.xml中定义配置来创建CronJobs和Jobs(扩展了AbstractJobPerformable)。但是,我无法获得这些作业来访问Web上下文中的bean。我可以在网络环境中创建CronJob和Job吗?如果是,怎么办?

我需要作业在Web上下文中工作的原因是我需要访问ehcache并对其进行操作。

2 个答案:

答案 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>
    }
}