AuditorAware не предоставляет последнее значение потокам Spring Batch - PullRequest
0 голосов
/ 09 июля 2019

У меня есть пакетное приложение Spring, в котором мы используем SimpleJobLauncher.При этом у нас есть запрос Rest для запуска пакетного задания в Excel, который при сохранении сущности на этапе записи не выбирает последний набор AuditorAware через полученный поток HTTP.

Я попытался установить имя пользователя в JobParameter и затем извлечьТо же самое в Writer для установки локальной переменной потока имени пользователя, но она также не выбирается.

Я использую Threadlocal для сохранения пользователя, как только мы получим запрос, который предоставляет информацию о пользователе для audorawareware.

public static final InheritableThreadLocal<String> USERNAME = new InheritableThreadLocal<>();

    @Bean
    public AuditorAware<String> auditorProvider() {
        if (USERNAME.get() != null) {
            return () -> Optional.of(USERNAME.get());
        }
        return () -> Optional.of(WebConstant.DEFAULT_USER);
    }

public class HeaderInterceptor implements HandlerInterceptor  {

    /**
     * This implementation always returns {@code true}.
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        String username = request.getHeader("username");
        if(null == username) {
            throw new UserNotProvidedException("USER_NOT_PROVIDED");
        }
        USERNAME.set(username);
        return true;
    }
}

1 Ответ

0 голосов
/ 10 июля 2019

Если я правильно понимаю ваш вопрос, вы вводите имя пользователя в ThreadLocal в одной теме, а затем пытаетесь получить к нему доступ из другой темы.

Из документации ThreadLocal должно быть очевидно, что это не сработает.

каждый поток, который обращается к одному (через метод get или set), имеет свою собственную, независимо инициализированную копию переменной.

Вам необходимо передать имя пользователя в пакетное задание другими способами. Я никогда не использовал Spring Boot, но эта статья описывает JobContext и как его использовать.

Я не уверен, что вы можете внедрить что-либо из этого в свой AuditorAware. В качестве альтернативы вы можете поместить значение в ThreadLocal в начале любого запуска в один Thread в вашей настройке.

...