Как создать bean-компонент с областями «запрос» и «расписание» одновременно?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как создать bean-компонент с областями «запрос» и «расписание» одновременно?

Сообщение Anonymous »

У меня есть bean-компонент UsersHandledInRequestCache, который используется для кэширования во время запроса:

Код: Выделить всё

@Configuration
public class CacheConfiguration {

@Bean
@RequestScope
public UsersHandledInRequestCache usersHandledInRequestCache() {
return new UsersHandledInRequestCache();
}

public static class UsersHandledInRequestCache {
private final Set cachedUsersIds = new HashSet();

public void cache(Integer userId) {
this.cachedUsersIds.add(userId);
}

public boolean isCached(Integer userId) {
return this.cachedUsersIds.contains(userId);
}
}
}
И у меня есть сервис, который использует этот компонент:

Код: Выделить всё

@Service
public class UserService {

@Resource(name = "usersHandledInRequestCache")
private CacheConfiguration.UsersHandledInRequestCache usersHandledInRequestCache;

public void doSomething(Integer userId) {
if (!usersHandledInRequestCache.isCached(userId)) {
// do something
usersHandledInRequestCache.cache(userId);
}
}
}
Таким образом, сервис может вызываться контроллерами и проблем нет:

Код: Выделить всё

@RestController
@RequiredArgsConstructor
@RequestMapping("/users")
public class UserController {

private final UserService userService;

@PostMapping
public void doSomething(@RequestBody Collection usersIds) {
usersIds.forEach(userService::doSomething);
}
}
В этом случае компонент UsersHandledInRequestCache создается для каждого запроса и работает правильно. Но кроме того, у меня есть плановое обслуживание:

Код: Выделить всё

@Component
@RequiredArgsConstructor
public class UserJob {

private final UserService userService;

@Scheduled(cron = "0 0 7 * * *")
public void doSomething() {
userService.getSomeUsersIds.forEach(userService::doSomething);
}
}
И когда запланированная служба начинает работать, я получаю исключение из-за того, что поле UserService#usersHandledInRequestCache не может быть инициализировано (потому что нет никаких запросов и вызова методов инициируется запланированной работой службы):

Ошибка создания bean-компонента с именем
'scopedTarget.usersHandledInRequestCache': Scope 'запрос' не
активен для текущего потока; рассмотрите возможность определения прокси-сервера с ограниченной областью действия для
этого компонента, если вы собираетесь ссылаться на него из синглтона; Вложенным
исключением является java.lang.IllegalStateException: запрос, связанный с потоком,
не найден: вы ссылаетесь на атрибуты запроса за пределами фактического
веб-запроса или обрабатываете запрос за пределами исходногополучающий поток? Если вы на самом деле работаете с веб-запросом
и все равно получаете это сообщение, ваш код, вероятно, выполняется вне
DispatcherServlet: в этом случае используйте RequestContextListener или
RequestContextFilter, чтобы предоставить текущий запрос.

Я хочу создать bean-компонент UsersHandledInRequestCache с областью «запрос» и областью «расписание» одновременно. Как я могу это получить?

Подробнее здесь: https://stackoverflow.com/questions/765 ... t-one-time
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»