Могу ли я создать CronJob и Job в веб-контексте? - PullRequest
0 голосов
/ 11 декабря 2018

Обычно мы можем создавать CronJobs и Jobs (которые расширяют AbstractJobPerformable), определяя конфигурацию в *-items.xml и *-spring.xml.Однако я не могу получить эти задания для доступа к bean-компонентам в веб-контексте.Могу ли я создать CronJob и Job в веб-контексте?Если да, то как?

Причина, по которой мне нужны задания для работы в веб-контексте, заключается в том, что мне нужен доступ к ehcache и манипулирование им.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Если вы хотите продолжать использовать по умолчанию cronJobService для запуска своих заданий, то, вероятно, единственным решением будет «правильно» получить доступ к необходимому веб-контексту.

Пример скрипта groovy дляполучить доступ к контексту веб-приложения по его имени.

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>
    }
}
0 голосов
/ 11 декабря 2018

Вам не нужно создавать работу в своем веб-контексте.Создайте собственное расширение для этой работы и зависимость от вашего расширения фасадов.

...