#guice #gwt-rpc
#guice #gwt-rpc
Вопрос:
В настоящее время я занимаюсь рефакторингом серверной части существующего проекта.
Теперь мы используем guice для привязки определенных модулей и его объектов.
За последние 2 недели у нас часто возникает проблема, которая выглядит так, что guice перепутывает некоторые используемые экземпляры объектов.
Проблема заключается в классе, который отвечает за создание строки, которая будет вставлена в базу данных. Этот класс используется из службы rpc, которую можно вызывать довольно быстро подряд. Итак, что происходит, так это то, что служба RPC 1 вызывает этот класс, а тем временем служба RPC 2 также вызывает этот класс и изменяет глобальный параметр, который используется для построения строк. Класс builder довольно глуп, поскольку он принимает параметр из метода, устанавливает некоторые части параметра в качестве глобальных переменных и обрабатывает строку.
Я думаю, что основной проблемой являются глобальные переменные, но я не знаю, как я мог бы избавиться от них элегантным способом. Они используются во всех других методах, которые вызываются из метода init(например, startMethod() вызывает buildStringOne() , buildStringTwo(), и они обращаются к обеим глобальным переменным, которые установлены в startMethod()).
Есть ли лучший способ, как я мог бы связать этот объект, или мне нужно удалить глобальные переменные и предоставить их в качестве параметра в других методах?
Спасибо за вашу помощь.
Ответ №1:
Использование общего изменяемого состояния вызывает проблемы. Похоже, ваша основная проблема действительно связана с безопасностью потоков. Однако вам не нужно решать проблемы потокобезопасности, делая изменяемое состояние потокобезопасным — вы также можете просто сделать так, чтобы состояние было видно только одному потоку.
Возможно, вы сможете использовать объекты Guice в области запросов для решения этой проблемы. Если проблемный класс можно использовать таким образом, что он вводится, Guice предоставит новый экземпляр для каждого запроса сервлета. Если вы используете его в классах с более длинной областью действия, чем Request (например, Singleton), введите поставщика. Вызов get() вернет соответствующий экземпляр Foo для запроса, который обрабатывает вызывающий поток.
См. https://code.google.com/p/google-guice/wiki/ServletModule#Using_RequestScope для большего.