Java: к синхронизированному методу обращаются несколько раз с помощью рефлексии? - PullRequest
4 голосов
/ 21 июня 2011

У меня очень странное поведение в классе, и я точно не знаю, что происходит.

1) У меня есть JSP, который отправляет запрос сервлету с AJAX 2) Сервлет обрабатывает этот запрос следующим образом: - Он создает отражение класса, а затем вызывает метод (который предоставляется в качестве параметра из JSP), а затем выводит результат метода обратно в Ajax.

Итак, вот исходная проблема, а затем частичное решение, которое я придумала:

Вызов метода выполнялся несколько раз, но я не знаю почему. JSP-Ajax только называет его ОДИН РАЗ (проверенный много раз), но сервлет был похож на «перезагрузку себя» и вызов метода несколько раз, таким образом вызывая ошибки в процессе. Поскольку я не мог найти, что происходит с сервлетом, я синхронизировал «отраженный» метод, поэтому независимо от того, сколько раз он был запрошен, один запрос будет завершен, а затем другой, и так далее. Я поместил пару сообщений в вывод, записывая, когда к методу обращались и когда он закончил работу.

Но ... сообщение, которое сигнализирует о том, что к нему обращались, пишется несколько раз до выдачи сообщения о завершении ... поэтому я не понимаю, может быть, синхронизация не работает с отражением? Чего мне не хватает, почему к методу обращаются несколько раз до его завершения? Просто не понимаю. Вы можете мне помочь?

Кроме того, у вас есть какие-нибудь идеи по поводу оригинальной проблемы (сервлет, такой как "перезагрузка")? В этой задаче я думаю, что, возможно, отправляется заголовок, который заставляет сервлет перезагрузиться, но точно не знаю.

EDIT:

На самом деле я делаю пример. Это мой код сервлета:

Class clase = Class.forName("com.cargaporinterfase.CargaPorInterfase_"+cd_matriz); Object obj = clase.newInstance(); Method met = clase.getDeclaredMethod(metodo, new Class[]{String.class, String.class});

и вызываемый метод:

public synchronized String procesar(String url,String nu_spid) throws CargaPorInterfaseException{ //... more processing }

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Возможно, вы захотите получить больше информации о том, что делает synchronized.

Я синхронизировал «отраженный» метод, поэтому независимо от того, сколько раз он запрашивался, один запросзакончит [...]

synchronized для метода совпадает с synchronized(this) {...}, где this - это объект, для которого вы вызываете метод.

Вполне возможно, что вы работаете с несколькими различными экземплярами одного и того же класса (в котором вы используете отражение), и в этом случае synchronized не будет работать, как вы думаете.Кроме того, синхронизация по отраженному объекту полностью отличается от синхронизации по запросу (я предполагаю, что вам придется синхронизировать свой экземпляр сервлета, хотя в некоторых случаях у вас также может быть несколько экземпляров).

3 голосов
/ 21 июня 2011

Некоторые предположения:

Когда вы говорите «Это отражение класса», я предполагаю, что это означает, что вы используете отражение для создания нового объекта.

Я предполагаю, что методы, которые вы вызываете, являются методами экземпляра (не статическими). ​​

Таким образом, если эти предположения верны, то синхронизация вызовов метода, который вы вызываете с помощью отражения, не препятствует перекрытию вызовов, поскольку каждый раз вы вызываете метод для другого объекта. Если вы добавите ключевое слово synchronized в определение метода, оно использует объект, для которого вызывается метод, в качестве блокировки.

...