![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| x4444 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 7.2.2006 Репутация: нет Всего: 1 |
серверная часть программы (сервлет) должна сохранять данные, которые ввел пользователь в xml файл.
условия такие, что одновременно на Tomcat могут быть запущены несколько Applications (однотипных), пишущих в один xml файл. http://server/app1/servlet1 http://server/app2/servlet1 . . . сейчас я пишу мотдом Transformer.transform(Sourse, Result)
т.е. никаких блокировок не ставлю Совсем неуверен, что так оно будет безопасно. Как правильно безопасно записать XML в файл? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Э-э-э, ну как бы тебе объяснить... Сделать потокобезопасный OutputStream, это не сложно, но это не гарантирует, что там будет корректный XML.
Наверно надо в твоем приложении делать синхронизацию, как только приложение хочет записать данные, оно захватывает блокировку, пишет их, а потом снимает ее. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| x4444 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 7.2.2006 Репутация: нет Всего: 1 |
Сейчас я сделал свой синхронизированный метод addToXML() (в классе обрабатывающего сервлета) который делает следующее 1. parse XML файл в документ 2. добавляет новые ноды в документ 3. трансформирует документ в XML файл Т.о. в рамках одного application (ввиду того, что обрабатывающий сервлет только один) стало безопасно. Но апликейшенов несколько, а файл один. Поэтому вполне возможно, что один application начал parse в то время как второй уже добавил ноды, но еще не записал. Поэтому мне надо чтобы при начале выполнения метода addToXML на файл накладывался запрет на чтение и запись. т.е. мне нужно монопольно юзать файл. Т.е. это на уровне ОС должно происходить. Рекомендуют смотреть в сторону java.nio.channels.FileLock, java.nio.channels.FileChannel , там есть методы lock(), tryLock() Но как конкретно сделать еще не понял, FileChannel можно получить из FileOutputStream методом getChannel(), и получив FileChannel можно попытаться наложить замок на файл ( tryLock() ). Однако как подсунуть FileChannel трансформеру XML . У классов ветки Result (e.g. StreamResult) нет конструктора c параметром FileChannel. Это сообщение отредактировал(а) x4444 - 6.4.2006, 13:44 |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
А зачем тебе передавать Transformer-ру FileChannel? Передавай ему FileOutputStream.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| x4444 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 7.2.2006 Репутация: нет Всего: 1 |
я вот думаю в каком порядке делать снятие замка и закрытие стрима и канала
вроде как сначала закрыть стрим потом сянять замок и закрыть канал правильно? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Закрытие канала снимает блокировку, поэтому - вначале ставишь блокировку (shared - на чтение, exclusive - на запись), затем пишешь/читаешь данные, если писал выполняешь flush(), снимаешь блокировку, закрываешь поток.
Только учти одну вещь:
Под Windows во всяком случае, все нормально работает, за другие ОС не скажу. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| x4444 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 7.2.2006 Репутация: нет Всего: 1 |
Непонятно почему, но не поучается наложить замок на FileInputStream.
получаю Exception: null
тот же самый код но с FileOutputStream работает нормально |
|||
|
||||
| firedrago |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 22.9.2005 Репутация: 2 Всего: 3 |
а не проще ли создавать пустой лок файл
все остальные спят пока myLockFile.exists().... как только лок файл удален - начинает работу следующий.... ....я бы так сделал....наверное..... |
|||
|
||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Потому что ты пытаешься захватить exclusive блокировку у канала который read-only. Для read-only каналов ты можешь захватывать только shared блокировку:
Shared блокировка совместима с другими shared блокировками, но не совместима с exclusive блокировками. Т.е. захватить несколько shared блокировок на один файл ты сможешь, но exclusive блокировка будет только одна - не будет никаких других блокировок на файл. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
| Ortega |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.11.2005 Где: Харьков, Украина Репутация: 4 Всего: 6 |
под Linux тоже работает, во всяком случае, exclusive --------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |