Как я могу изменить значение переменной сеанса в произвольном классе Java

У меня есть сервлет Java, который устанавливает переменную сеанса и вызывает класс потока. Я реализую следующее

@WebServlet("/ExportLogs")
public class ExportLogs extends HttpServlet
{
    public void doGet(HttpServletRequest request , HttpServletResponse response) throws ServletException,IOException
    {

        Integer completePercent = new Integer(10);

        request.getSession().setAttribute("CompletionStatus" , completePercent);

        LogExportingProcess export = new LogExportingProcess();
        export.start();
    }
}

и у меня есть класс потока, который выполняет длинный процесс следующим образом;

class LogExportingProcess extends Thread 
{
    public void run()
    {
        //i want to change the value of the percent complete variable in here. 
    }   
}

Теперь я хочу изменить значение completePercent внутри класса LogExportingProcess. Как я могу этого добиться.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
339
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно будет передать объект Session при создании LogExportingProcess

class LogExportingProcess extends Thread 
{
    private HttpSession session;

    public LogExportingProcess(HttpSession session) {
       this.session = session;
    }

    public void run()
    {
        session.setAttribute("CompletionStatus" , completePercent);
    }   
}

и одно изменение в классе ExportLogs

LogExportingProcess export = new LogExportingProcess(request.getSession());

Остерегайтесь, сессия могла быть закрыта тем временем, что могло привести к неожиданной установке атрибута в закрытом сеансе. Я бы посоветовал использовать промежуточный объект, хранящийся в сеансе и содержащий все атрибуты, которые могут быть изменены асинхронным потоком.

Serge Ballesta 15.03.2018 10:38

@Yogesh Badke большое спасибо именно так, как я хотел, чтобы это было

vickee 15.03.2018 10:44

@Serge Ballesta, спасибо за предложение, я сделаю это

vickee 15.03.2018 10:46

Я повторю то, что сказал Серж Бальеста. У меня есть ответ ниже, который сочетает в себе совет Йогеша Бадке с советом Сержа Баллеста с использованием AtomicInteger.

Michael Akerman 19.03.2018 21:41

Целое число неизменяемо. AtomicInteger был бы хорошей заменой.

@WebServlet("/ExportLogs")
public class ExportLogs extends HttpServlet
{
    public void doGet( final HttpServletRequest request , final HttpServletResponse response ) throws ServletException,IOException
    {
        final AtomicInteger completePercent = new AtomicInteger(10);

        request.getSession().setAttribute("CompletionStatus" , completePercent);

        final LogExportingProcess export = new LogExportingProcess( completePercent );
        export.start();
    }
}

class LogExportingProcess extends Thread 
{
    final AtomicInteger completePercent;

    public LogExportingProcess( final AtomicInteger completePercent ) 
    {
       this.completePercent = completePercent;
    }

    public void run()
    {
        completePercent.set( 80 ); //80% complete, substitute with real code
    }   
}

Это предпочтительнее, IMHO, чем хранение ссылки на объект HttpSession, как предлагает Йогеш Бадке, поскольку HttpSession может обычно собираться мусором по истечении времени ожидания, а AtomicInteger увеличивает инкапсуляцию, разделяя только процент, а не всю информацию о сеансе.

Другие вопросы по теме