синхронизированный блок в классе тегов JSP - PullRequest
1 голос
/ 31 мая 2010

Я пытаюсь найти ответ для следующего за последние пару дней, но не могу найти исчерпывающий ответ

Постановка проблемы

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

CODE

                        synchronized (this){
                        final String reportFileName = "testReport.csv";
                        File reportDir = new File( rootCsDirectory, "reports" );
                        if(!reportDir.isDirectory())reportDir.mkdir();                          
                        File reportFile = new File (reportDir, reportFileName);
                        logReport(reportFile,reportContent.toString());
                        }

ВЫПУСК: - Объект File может быть открыт одним потоком для записи, и в то же время другой поток может попытаться получить доступ и завершиться с ошибкой и выдать исключение. Поэтому я подумал о синхронизации (onобъект) должен решить проблему, но читайте где-нибудь, где у jsp engine будет пул объектов тегов jsp , поэтому я боюсь, что synchronized (this) не будет работать, и это должно бытьизменено на synchronized (this.getClass ()) FYI: Приведенный выше код помещен в класс пользовательских тегов JSP.

EDIT:

Вопрос 1: в случае синхронизации блока кода с помощью synchronized (this) ИЛИ synchronized (this.getClass ())

Вопрос 2: Как будет выглядеть тот же сценарийобрабатывается, если веб-приложение развернуто в кластерной среде?

Ответы [ 3 ]

1 голос
/ 31 мая 2010

Я бы синхронизировался на более тонком уровне и выбрал бы объект, который более тесно связан с созданием файла.

например. абстрагируйте вышеупомянутое в класс FileManager и позвольте единственному экземпляру этого синхронизироваться с объектом блокировки (удерживаемым внутри FileManager - возможно, он может блокироваться сам по себе).

Таким образом, вы контролируете синхронизацию на более высоком уровне, и у вас больше контроля над объектами, на которые вы блокируете. Они не контролируются вашим сервлетом / веб-контейнером.

0 голосов
/ 31 мая 2010

Я бы проверил материал в пакете java.util.concurrent.

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

Это позволит красиво и эффективно сериализовать доступ к этому файлу.

0 голосов
/ 31 мая 2010

Как насчет того, чтобы поместить его в синхронизированный метод, чтобы вы могли не обращать внимания на детали управления JSP?

...