System Whide [Number/Date]Format
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 10.06.07 13:31
Оценка:
Господа. кто как решает вопрос доступа к [Number/Date]Format-ерам. Хочется прописать формат где-нить в одном месте (для каждой локали ес-но) и использовать повсеметсно. Но где прописать, а главное, как прописать так, что бы не возникало проблем в многопоточной среде. Может у кого есть не кастыли и грабли, но изящный подход, которым можно поделиться?
Blog
Re: System Whide [Number/Date]Format
От: aefimov Россия
Дата: 10.06.07 19:32
Оценка:
Здравствуйте, Lucker, Вы писали:

L>Господа. кто как решает вопрос доступа к [Number/Date]Format-ерам. Хочется прописать формат где-нить в одном месте (для каждой локали ес-но) и использовать повсеметсно. Но где прописать, а главное, как прописать так, что бы не возникало проблем в многопоточной среде. Может у кого есть не кастыли и грабли, но изящный подход, которым можно поделиться?


Костыли там в самой консерватории. Все эти Format не thread-safe. Поэтому хранить именно их смысла нет. А где хранить строковые шаблоны, ну это дело сугубо интимное у каждого
Re[2]: System Whide [Number/Date]Format
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 11.06.07 05:32
Оценка:
Здравствуйте, aefimov, Вы писали:

A>Здравствуйте, Lucker, Вы писали:


L>>Господа. кто как решает вопрос доступа к [Number/Date]Format-ерам. Хочется прописать формат где-нить в одном месте (для каждой локали ес-но) и использовать повсеметсно. Но где прописать, а главное, как прописать так, что бы не возникало проблем в многопоточной среде. Может у кого есть не кастыли и грабли, но изящный подход, которым можно поделиться?


A>Костыли там в самой консерватории. Все эти Format не thread-safe. Поэтому хранить именно их смысла нет.


Ну по одному на поток почему бы и нет.

A>А где хранить строковые шаблоны, ну это дело сугубо интимное у каждого

Да вопрос то не про шаблоны, а про то, как бы в современных условиях IoC и DI не заморачиваться созданием таких вот объектов дедовским способом а наконфигурять все спрингом/тапестрями в туда в-где это надо.
Blog
Re[3]: System Whide [Number/Date]Format
От: b_manvelyan Украина  
Дата: 11.06.07 08:39
Оценка:
Здравствуйте, Lucker, Вы писали:

L>Да вопрос то не про шаблоны, а про то, как бы в современных условиях IoC и DI не заморачиваться созданием таких вот объектов дедовским способом а наконфигурять все спрингом/тапестрями в туда в-где это надо.


А в чем проблема-то?
1) конфигурять строковые шаблоны. Пусть те кому надо создают свои [Date/Number]Format.
2) наконфигурять [Date/Number]Format, В спринге использовать подходящий bean scope.
Re[4]: System Whide [Number/Date]Format
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 11.06.07 08:48
Оценка:
Здравствуйте, b_manvelyan, Вы писали:

_>Здравствуйте, Lucker, Вы писали:


L>>Да вопрос то не про шаблоны, а про то, как бы в современных условиях IoC и DI не заморачиваться созданием таких вот объектов дедовским способом а наконфигурять все спрингом/тапестрями в туда в-где это надо.


_>А в чем проблема-то?

_>1) конфигурять строковые шаблоны. Пусть те кому надо создают свои [Date/Number]Format.
_>2) наконфигурять [Date/Number]Format, В спринге использовать подходящий bean scope.

а попытки делал? вроде как во всяких там форматтерах полно final методов, которых спринг обсерится переопределять в генерируемых проксях.
Blog
Re[5]: System Whide [Number/Date]Format
От: b_manvelyan Украина  
Дата: 11.06.07 09:01
Оценка:
Здравствуйте, Lucker, Вы писали:

L>а попытки делал? вроде как во всяких там форматтерах полно final методов, которых спринг обсерится переопределять в генерируемых проксях.


Сделал. Все нормально. Где должны были появиться обсеренные прокси?
Re[6]: System Whide [Number/Date]Format
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 11.06.07 09:12
Оценка:
Здравствуйте, b_manvelyan, Вы писали:

_>Здравствуйте, Lucker, Вы писали:


L>>а попытки делал? вроде как во всяких там форматтерах полно final методов, которых спринг обсерится переопределять в генерируемых проксях.


_>Сделал. Все нормально. Где должны были появиться обсеренные прокси?


ну, чисто теоретически, он же генерит CGLIB-овские прокси для бинов, делая класс, расширяющий тип бина и для каждого метода генерит делегат.
Тот же NumberFormat имеет кучу финал методов, по-этому использовать его в качестве класса, для которого генерится прокси, не получится. А иметь тупой Format не всегда удобно, бо как иногда надо прикастить к конкретному типу дабы выставить дополнительные параметры (например roundingMode или prseIntegerOnly).
Blog
Re[7]: System Whide [Number/Date]Format
От: b_manvelyan Украина  
Дата: 11.06.07 09:49
Оценка:
Здравствуйте, Lucker, Вы писали:

L>ну, чисто теоретически, он же генерит CGLIB-овские прокси для бинов, делая класс, расширяющий тип бина и для каждого метода генерит делегат.

L>Тот же NumberFormat имеет кучу финал методов, по-этому использовать его в качестве класса, для которого генерится прокси, не получится. А иметь тупой Format не всегда удобно, бо как иногда надо прикастить к конкретному типу дабы выставить дополнительные параметры (например roundingMode или prseIntegerOnly).

Ну чисто теоритические рассуждения хороши. Ты практически сам пробовал? Наверно у меня пример не правильный, но возвращается нормальный DateFormat, NumberFormat, и нет никаких прокси. Объясни для тупых, почему для них должны генерироваться прокси. Спринг не всегда генерирует прокси.
Re[8]: System Whide [Number/Date]Format
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 11.06.07 10:05
Оценка: 1 (1)
Здравствуйте, b_manvelyan, Вы писали:

_>Ну чисто теоритические рассуждения хороши. Ты практически сам пробовал? Наверно у меня пример не правильный, но возвращается нормальный DateFormat, NumberFormat, и нет никаких прокси. Объясни для тупых, почему для них должны генерироваться прокси. Спринг не всегда генерирует прокси.


Объясняю для всех, не только для тупых. Что бы заиньектить (type1)-scoped бины в (type2)-scoped бины (например request-scoped Format в singleton scoped ReposrtService) спрингу нужно сгенерить проксю для (type1)-scoped бина, которую он заиньектит в (type2)-scoped бин. Когда (type2)-scoped бин вызывает какой-нить метод у заиньекченого (type1)-scoped бина, спринговая прокся пытается получить target-бин в заданом type1-скопе и делегировать вызов ему. Если каждый раз просить бин у BeanFactory напрямую, а не использовать прозрачный DI, то прокся не нужна, но тогда этот способ ни чем не лучше ручного создания Format-еров.
Blog
Re[9]: System Whide [Number/Date]Format
От: aefimov Россия
Дата: 11.06.07 19:26
Оценка:
Здравствуйте, Lucker, Вы писали:

L>Объясняю для всех, не только для тупых. Что бы заиньектить (type1)-scoped бины в (type2)-scoped бины (например request-scoped Format в singleton scoped ReposrtService) спрингу нужно сгенерить проксю для (type1)-scoped бина, которую он заиньектит в (type2)-scoped бин. Когда (type2)-scoped бин вызывает какой-нить метод у заиньекченого (type1)-scoped бина, спринговая прокся пытается получить target-бин в заданом type1-скопе и делегировать вызов ему. Если каждый раз просить бин у BeanFactory напрямую, а не использовать прозрачный DI, то прокся не нужна, но тогда этот способ ни чем не лучше ручного создания Format-еров.


Если я правильно понял, то при делигировании к type1-scope теряется Thread-Safeтность этого форматера.
Re[10]: System Whide [Number/Date]Format
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 12.06.07 06:10
Оценка:
Здравствуйте, aefimov, Вы писали:

L>>Объясняю для всех, не только для тупых. Что бы заиньектить (type1)-scoped бины в (type2)-scoped бины (например request-scoped Format в singleton scoped ReposrtService) спрингу нужно сгенерить проксю для (type1)-scoped бина, которую он заиньектит в (type2)-scoped бин. Когда (type2)-scoped бин вызывает какой-нить метод у заиньекченого (type1)-scoped бина, спринговая прокся пытается получить target-бин в заданом type1-скопе и делегировать вызов ему. Если каждый раз просить бин у BeanFactory напрямую, а не использовать прозрачный DI, то прокся не нужна, но тогда этот способ ни чем не лучше ручного создания Format-еров.


A>Если я правильно понял, то при делигировании к type1-scope теряется Thread-Safeтность этого форматера.


Наоборот, если type1-scope=request/tread scope то Thread-Safeтность этого форматера соблюдается, так как скоп его использования — один поток.
Blog
Re[11]: System Whide [Number/Date]Format
От: aefimov Россия
Дата: 13.06.07 05:11
Оценка:
Здравствуйте, Lucker, Вы писали:

A>>Если я правильно понял, то при делигировании к type1-scope теряется Thread-Safeтность этого форматера.


L>Наоборот, если type1-scope=request/tread scope то Thread-Safeтность этого форматера соблюдается, так как скоп его использования — один поток.


Непонятно...
Вот смотри, есть дорога с поездом. Одна дорога — много поездов, все thread-safe. Мы берем и кладем на эту дорогу рельсы другой дороги. Другая дорога, тоже thread-safe. Но на пересечении есть шанс воткнуться не в свой поезд. Нет?
Re[12]: System Whide [Number/Date]Format
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 13.06.07 05:32
Оценка:
Здравствуйте, aefimov, Вы писали:

A>Непонятно...

A>Вот смотри, есть дорога с поездом. Одна дорога — много поездов, все thread-safe. Мы берем и кладем на эту дорогу рельсы другой дороги. Другая дорога, тоже thread-safe. Но на пересечении есть шанс воткнуться не в свой поезд. Нет?
Давай так, поезда отдельно — форматеры отдельно, а то я в абстракции туго вьезжаю.
Есть некий сервис, скажем ReportsService. Ему для формирования отчетов нужен NumberFormat, прчем с форматом специфичным для пользователя, запускающего функцию генерации отчета. Но меньше всего хочется заставлять сам сервис знать о том, что кто-то там его запускает и от этого кого-то зависит то, каким форматом выводить числа. Т.е. тупо хочется сконфигурять в спринге Singleton ReportsService каким-нибудь request-scoped NumberFormat. Т.е. каждый конкретный объект NumberFormat будет привязан к потоку, а ReportsService будет использовать проксю, которая делегирует все вызовы конкретному NumberFormat-у. В задачу этой проки входит устранения возможности столкновения твоих поездом, семафором ли, или разнесением дорог на разные уровни, самих NumberFormat-ов это не волнует.
Blog
Re[13]: System Whide [Number/Date]Format
От: aefimov Россия
Дата: 13.06.07 06:20
Оценка:
Здравствуйте, Lucker, Вы писали:

L>Давай так, поезда отдельно — форматеры отдельно, а то я в абстракции туго вьезжаю.

L>Есть некий сервис, скажем ReportsService. Ему для формирования отчетов нужен NumberFormat, прчем с форматом специфичным для пользователя, запускающего функцию генерации отчета. Но меньше всего хочется заставлять сам сервис знать о том, что кто-то там его запускает и от этого кого-то зависит то, каким форматом выводить числа. Т.е. тупо хочется сконфигурять в спринге Singleton ReportsService каким-нибудь request-scoped NumberFormat. Т.е. каждый конкретный объект NumberFormat будет привязан к потоку, а ReportsService будет использовать проксю, которая делегирует все вызовы конкретному NumberFormat-у. В задачу этой проки входит устранения возможности столкновения твоих поездом, семафором ли, или разнесением дорог на разные уровни, самих NumberFormat-ов это не волнует.

Понятно. Только это же эквивалент утилитного метода synchronized Formats.formatAsBlaBlaBla(...)
Просто несколько спрятанный за делегатами стринга.
Re[14]: System Whide [Number/Date]Format
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 13.06.07 06:27
Оценка:
Здравствуйте, aefimov, Вы писали:

A>Понятно. Только это же эквивалент утилитного метода synchronized Formats.formatAsBlaBlaBla(...)


ну почему. Если они ThreadBound, какой тут synchronized?

A>Просто несколько спрятанный за делегатами стринга.


ну, все что спрятано за делегатами спринга, можно так или инаже выразить через "утилитные методы BlaBlaBla.doAsBlaBlaBla(...)". Только вот если результат один и тот же, зачем писать больше?
Blog
Re[3]: System Whide [Number/Date]Format
От: dshe  
Дата: 13.06.07 07:05
Оценка: 5 (1)
Здравствуйте, Lucker, Вы писали:

A>>А где хранить строковые шаблоны, ну это дело сугубо интимное у каждого

L>Да вопрос то не про шаблоны, а про то, как бы в современных условиях IoC и DI не заморачиваться созданием таких вот объектов дедовским способом а наконфигурять все спрингом/тапестрями в туда в-где это надо.

Можно посмотреть в сторону org.apache.commons.lang.time.FastDateFormat, если можно ограничиться форматированием дат.

В более общем случае я вижу такие варианты:

1. Сделать адаптер(ы) над Format'ами (с интерфейсом, чтобы можно было делать JDK proxy) и инжектить везде, где нужно, его/их вместо Format'ов.
Хорошо: можно делать полноценные прокси (final методы не мешают).
Плохо: появляются зависимости по всему проекту от каких-то непонятных адаптеров; возможность низкоуровневого обращения к Format'ам (там всякие roundingMode или prseIntegerOnly) ограничивается интерфейсом адапера.

2. Сделать Format'в со скопом prototype и инжектить их через <lookup-method>.
<beans>
    <bean id="myFormat" class="java.text.SimpleDateFormat" singleton="false" .../>
    <bean id="beanThatUsesFormat" ...>
        <lookup-method name="newFormat" ref="myFormat"/>
    </bean>
</beans>

Чтобы уменьшить overhead на создание каждый раз нового Format'а, можно попробовать использовать method clone.
<beans>
    <bean id="myFormatPrototype" class="java.text.SimpleDateFormat" .../>
    <bean id="myFormat" factory-bean="myFormatPrototype" factory-method="clone" singleton="false" .../>
    <bean id="beanThatUsesFormat" ...>
        <lookup-method name="newFormat" ref="myFormat"/>
    </bean>
</beans>

Хорошо: работаем с Format'ами напрямую.
Плохо: обязаны использовать cglib; (потенциально) overhead на создание нового Format'а.
--
Дмитро
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.