Threadsafe Guice Binding - PullRequest
       8

Threadsafe Guice Binding

0 голосов
/ 29 сентября 2011

В настоящее время я выполняю рефакторинг серверной части существующего проекта.

Теперь мы используем guice для привязки определенных модулей и их объектов.

За последние 2 недели у нас часто возникает проблема, которая выглядит так, как будто эта путаница смешивает некоторые из использованных экземпляров объекта.

Проблема в том, что класс отвечает за создание строки, которая будет вставлена ​​в базу данных. Этот класс используется из службы rpc, которую можно вызывать довольно быстро подряд. Таким образом, происходит то, что служба 1 RPC вызывает этот класс, а служба 2 RPC тем временем также вызывает этот класс и изменяет глобальный параметр, используемый для построения строк. Класс построителя довольно глуп, поскольку он берет параметр из метода, устанавливает некоторые части параметра в качестве глобальных переменных и обрабатывает строку.

Я думаю, что главной проблемой являются глобальные переменные, но я не знаю, как я мог бы избавиться от них элегантным способом. Они используются во всех других методах, которые вызываются из метода init (например, startMethod () вызывает buildStringOne (), buildStringTwo (), и они обращаются к обеим глобальным переменным, которые установлены в startMethod ()).

Есть ли лучший способ, как я мог бы связать этот объект, или мне нужно удалить глобальные переменные и предоставить их в качестве параметра в других методах?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 04 октября 2011

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

Вы можете использовать запрос Guice.объекты для решения этой проблемы.Если проблемный класс можно использовать таким образом, чтобы он внедрялся, Guice предоставит новый экземпляр для каждого запроса сервлета.Если вы используете его в классах с большей областью действия, чем Request (например, Singleton), введите поставщик.Вызов get () вернет соответствующий экземпляр Foo для запроса, который обрабатывает вызывающий поток.

Подробнее см. https://code.google.com/p/google-guice/wiki/ServletModule#Using_RequestScope.

...