пятница, 24 октября 2008 г.

Interceptors for Stateless Session Beans

Что за звери такие?

Суть в том, что перед вызовом бизнес-метода будет вызываться метод (или методы) определенных классов.
Все весьма и весьма просто.

1. Мы аннотируем бизнес-метод или бин вот так:
@Interceptors({LogDebugInterceptor.class, NotNullInterceptor.class})
2. В самом перехватчике должен быть метод (методы) а ля
@AroundInvoke
public Object methodName(InvocationContext inv) throws Exception
Они должны быть аннотированы и иметь указанную сигнатуру.

3. Очень интересен интерфейс
public interface InvocationContext {
public Object getTarget();
public Method getMethod();
public Object[] getParameters();
public void setParameters(Object[] params);
public java.util.Map getContextData();
public Object proceed() throws Exception;
}
с помощью него можно получить объект и метод, которые послужил причиной вызова перехватчика. А так же все параметры, переданные в бизнес-метод. Более того, параметры можно подменить с помощью метода setParameters.

4. Для успешного завершения необходимо венуть объект, возвращаемый функцией proceed()
return inv.proceed();
тогда управление будет передано следующему перехватчику, либо бизнес-методу.

Суть схожа с механизмом фильтров в сервлетах. Для чего можно использовать перехватчики? для обработки входных параметров, их проверки, проверки каких-либо ограничений. Например бизнес-метод depositMoney(Customer customer) можно перехватывать для проверки прав клиента на перевод денег.

четверг, 23 октября 2008 г.

Industry best practices

The last methodology principle we were consider is the using industry best practices.
Understanding and applying best practices can improve the flexibility and extensibility of a software solution.
Design principles are guide line [...] about half software interact and combine to providing flexibility, extensibility and deep coupling across the system.
This principles provide rules from which software pattern arise.
An example is the separation of concern principles. This principle stays that different types of behavior should be separated into different components.
The result of this principle is the coming separation between UI, service and entity components.
This principle also leads that [...] of your controller pattern and DAO pattern.
Software pattern can be defined as "a repeatable solution to the required problem within a context".
Patterns describe expert solutions to everyday problems. Patterns appear in all levels of system development.
Architectural patterns affect hight-level structure of the system and usually support non-functionally requirements.
An example of architectural pattern is load-ballancing. This pattern increase the system [equality??]
and system throughput by adding additional servers to handle [...].
Design patterns affect medium level of structure and usual support functional requirement.
An example of design pattern is a strategy pattern. This pattern allows the runtime selection one variant from a set of possible other variants.
An example of this can be sorting. There are many sorting algorithms such as the bubble sort, merge sort and so on.
Each sorting algorithm has its own kinds. The strategy pattern would propose the user to dynamically select an appropriate sort technique at runtime.

According Martin Fowler refactoring is "the process of changing the software system in such way than it doesn't effort the external behavior of the code, but improve internal structure". Refactoring is done all the time doing software development and especially doing maintenance.
Refactoring is recognized as regiment and significant practice.
Programmer should be [..] to develop [..] refactoring. Find several books in title refactoring providing detail exploration of this topic.
Sun microsystem's published documents that print together best practices in wide [...] of technical areas including J2EE development,
cluster configuration and so on. http://www.sun.com/blueprints

вторник, 21 октября 2008 г.

Modeling principles

In the past three slides we talked a lot about the model that created during software development workflows.
Lets step back a minute and ask an important question. Why do we want to create any these models?
If the ultimate goal is to create software, why should I waste time creating models?
..... then he wrote: we build models we can better understand the system we are developing.

Then building a house you could just buy some lumber and start nailing board together and hope that all that walls fit together.
And then you have room ... a kitchen (м.б. украсить или выбрать кухню).
Such [анхак] approach to build a house is unlike little fail.
Instead you hiring an architect and designer [хелс].
The architect create some model of the [хелс] in his head, but he must share his vision with you, the client.
In the construction [крую], it takes order in a house to construction requeres unique view of the architecture.
You, as an owner need to see artistic renderings of the exterior and landscaping,
the builder need to see three-dimensional views of rooms, doors, stairs and so on.
The electrician needs a wiring view, the plummer needs the view of pipes and so on.

Software development also uses models to represent aspects of the system.
All software developers have a mental model of the system they are building.
You can draw your own diagrams to visualize those mentals models. You can also draw a diagram to capture a design of some existing system.

Communication is very important for success of any software project.
Models help communicate the design and decisions being made about the project.
These decisions must be share with stakeholders, so everyone is on the same page about stages and direction of the project.
In large teams each workflow may be performer by different workers. As the project transitions from one workflow to the next,
it is important that workers document and communicate decisions to the next workflow group.
Models help document those decisions.

Specific UML diagrams show different views of these models.
For example you can use a class diagram to show types ant entities of the system.
And you can use the sequence diagrams to show time order flow of messages between objects to accomplish some functional requirements.

четверг, 25 сентября 2008 г.

EJB programming restrictions

Из EJB спецификации.
Для того, чтобы приложения были портируемы, существует несколько ограничений, накладываемых на enterprise beans. Вот они, наиболее важные, на мой взгляд, выделены.
  • Нельзя исползовать перезаписываемые static поля. Все static поля рекомендуется объявлять final. Поскольку контейнер может запускать бин на одной, а может на нескольких JVM.
  • Нельзя синхронизировать по тем же соображениям.
  • Нельзя использовать AWT-фукнциональность для ввода/вывода какой-либо информации, поскольку многие серверы приложений могут не поддерживать подобные приемы.
  • Нельзя исползовать пакет java.io, рытаться получить доступ к файловой системе. Файловая система не совсем подходит для хранения данных бизнес-компонентов. Для доступа к ресурсам лучше использовать другие API, например JDBC.
  • Нельзя слушать сокеты, акцептировать секетные соединения. Архитетура EJB позволяет быть сетевым клиентом, не нельзя быть сетевым сервером, поскольку такое поведение будет конфликтовать с основным предназначением enterprise бина - обслуживать EJB клиентов.
  • Нельзя получать и использовать информацию о классах через reflection API из соображений безопасности.
  • Нельзя создавать загрузчики классов (class loader), использовать текущий загрузчик, устанавливать контекстный загрузчик (set the context class loader), устанавливать менеджер безопасности, создавать новый, останавливать JVM, изменять потоки ввода, вывода и вывода ошибок (input, output, and error streams). Вся эта работа должна выполняться контенером. Попытка нарушить это правило может привести к проблемам с безопасностью, а так же может нарушить работу контейнера.
  • Нельзя устанавливать фабрику сокетов, используемую ServerSocket, Socket или URL. По тем же соображениям.
  • Из тех же соображений запрещены любые операции с потоками и группами потоков.
  • Нельзя напрямую читать/писать дескриптор файлов.
  • Нельзя пытаться получать security policy information, это может вызвать дыру в системе безопасности.
  • Нельзя трогать security configuration objects (Policy, Security, Provider, Signer, and Identity).
  • Нельзя использовать this в качестве аргумента или результата, вместо этого надо использовать функции SessionContext.getBusinessObject, Ses-
    sionContext.getEJBObject, SessionContext.getEJBLocalObject, Enti-
    tyContext.getEJBObject, or EntityContext.getEJBLocalObject instead.

среда, 27 августа 2008 г.

Java memory model in 500 words

Оригинальная статья

Что есть Java Memory Model? JMM объяснаяет почему дважды проверенный лдокинг не работает и как это исправить.

JMM отвечает на простой, казалось бы, вопрос: в какой момент можно будет прочесть значение 3 переменной myVariable после присвоения этого значения.

Правила такие:

  • Правило упорядочивания программы. В пределах программы действия происходят в запрограммированном порядке.
  • Monitor lock rule. Unlock on monitor происходит до следующего лока.
  • Volatile variable rule. A write to a volatile happens-before every subsequent read of that volatile.
  • Thread start rule. Thread.start happens-before actions in the Thread
  • Thread termination rule. Actions in a thread happens-before other threads detect the thread's termination.
  • Interruption rule. A thread calling interrupt on another thread happens before the interrupted thread detects the interrupt.
  • Finalizer rule. End of object construction happens-before start of object finalization.
  • Transitivity. If A happens-before B, and B happens-before C, then A happens-before C.

There you have it, the Java Memory Model in 500 words. This summary has been taken from Brian Goetz's Java Concurrency in Practice, which I can't recommend enough.

1. Используйте статические фабричные методы вместо конструкторо

Вместо конструктора можно использовать статические фабричные методы, как в классах-wrapper'ах, например Integer.valueOf(...)

Отметим, что static factory метод не тоже самое, что шаблон Factory, описываемый метод не имеет прямых аналогов в шаблонах проектирования.

Существует несколько преимуществ такого подхода по сравнению с использованием конструкторов.

Первое преимущество. Можно выбрать "говорящее" имя для static factory метода, что нельзя сделать для конструктора. Выбор имени может улучшить жизнь клиента, его код стоновится более читаемым. К тому же, возможет лишь один конструктор с фиксированным набором параметров, а методов может быть несколько.

Второе преимущество. Принципиальное преимущество заключается в том, что метод не обязан создавать новый экземпляр объекта, он может возвращать ссылку на уже созданный экземпляр, взяв его, например, из кэша. Это позволяет не дублировать экземпляры без необходимости. Такое поведение свойственно методу Boolean.valueOf(boolean). Классы, которые контролируют свои экземпляры подобным образом называют instance-controlled. Есть несколько причин написания instance-controlled классов. Это гарантирует что не существует двух эквивалентных объектов, что позволяет повысить производительность, клиенты могут использовать оператор == вместо equals. Все Enum-ы являются instance-controlled.

Третье преимущество - метод может возвращать экземпляр одного из субклассов, что дает большУю гибкость по сравнению с использование конструктора. Мы можем возврщать экземпляр без объявления класс публичным, т.е. полностью скрывать реализацию, что является ключевым моментом при проектировании компактного API. Интерфейсы не могут иметь статических методов, поэтому принято следующее соглашение. Если интерфейс называется Type, то статические фабричные методы, возвращающие реализации интерфейса, помещаются в класс с именем Types. Подобным образом организован Java Collections Framework. Т.е. все static factory методы сконцентрированы в одном классе и, кроме того, мы скрываем реилизации интерфейса.

Четвертое преимущество. Static factory методы уменьшают количество кода при использованиии generics.

Главный недостаток состоит в том, что нельзя создать субкласс к классу без public или protected конструктора.

Второй недостаток заключается в том, что их, в общем случае, невозможно отличить от других static методов. Обычно прибегают к специальному именованию таких методов:
• valueOf—возвращает объект, содержащий переданный аргумент.
• of—альтернатива valueOf, популярная в Enum-ах.
• getInstance—возвращает экземпляр, который описывается параметрами, но недльзя сказать что имеет тоже самое значение. В случае синглтона возвращает единственный экземпляр.
• newInstance—аналогичен getInstance, но гарантирует создание нового экземпляра.
• getType—аналогичен getInstance, но используется когда factory метод находится в другом классе. Type в данном случае заменяется, например getArrayList.
• newType—аналогичен newInstance.

Вообщем, static factory методы и публичные конструкторы имеют свои области применения.

Effective Java 2nd edition

I will read it in English...

вторник, 26 августа 2008 г.

Авто генерация UML диаграм в javadoc

Оригинальная статья

Разобрался как автоматически генерировать и вставлять диаграммы классов и пакетов в javadoc. Заточено под NetBeans. Инога весьма удобно.


пятница, 20 июня 2008 г.

ай шайтан

Некоторое время назад поставил я новую ubuntu 8.04, затем столо происходить странное: ни с того ни с сего интерфейс eth0 отключается, поднимается (пытается подняться) новый eth1, падает. В итоге в eth0 оказался опущенным и список dns оказывался пустым.

Долго тупил и не мог понять в чем дело, а оказалось что это происходит при подключении моего коммуникатора к usb, убунта видит потенциальный модем и пытается поднять через него соединение...

четверг, 15 мая 2008 г.

Java EE Transactions

Оригинал: http://java.sun.com/javaee/5/docs/tutorial/doc/bncih.html

Глава 33

Транзакции

Типичное enterprise приложение получает и хранит данные в одной или нескольких БД. Поскольку это информация критически важна для бизнес операций, она должна быть точной, достоверной и актуальной. Целосность данных может быть потеряна, если несколько приложений будут изменять данные одновременно. Целосность также будет нарушена, если данные останутся частично изменены ввиду какого-либо сбоя. Транзакции гарантируют целосность данных, предотвращая оба этих сценария. Транзакции контролируют совместный доступ к данным, а в случае сбоя гарантируют корректное восстановление данных.

Что такое транзакция?

Для моделирования бизнес-транзакции программе может потребоваться выполнить несколько шагов, например

начало транзакции
проверка состояния счета
обновление состояния счета
запись информации в лог
коммит транзакции

Либо все шаги должны завершиться коректно, либо ни один из них. Иначе целосность данных нарушится. Транзакция может завершиться двумя путями: коммитом, либо откатом (rollback).

Управляемые контейнером транзакции (Container-Managed Transactions)

В enterprise bean с container-managed transaction demarcation границы транзакций выставляет EJB контейнер. Вы можете использовать container-managed transactions как с session так и с message-driven bean. В этом случае разработка упрощается, поскольку Вы не имеете дело с транзакциями явно.

Обычно контейнер начинает транзакцию сразу после начала метода и коммитит непосредственно перед выходом из метода. Каждый метод ассоциирован с одной транзакцией, встроенные или множественные транзакции внутри метода не доступны.

Не во всех методах требеются транзакции, поэтому с помощью аттрибутов Вы можете настраивать необходимость использования транзакций.
Бины, не должны использовать методы, которые пересекаются с определением границ транзакций, например методы commit, setAutoCommit, rollback класса java.sql.Connection или commit, rollback класса javax.jms.Session. Если это необходимо, то используйте application-managed transaction demarcation.
Также нельзя использовать интерфейс javax.transaction.UserTransaction.

Аттрибуты транзакции

Аттрибуты транзакции определяют охват транзакции. На рис. 33-1 ставится вопрос: необходимо ли открывать новую транзакцию? Ответ зависит от аттрибутов method-B()

Рис. 33-1
A diagram showing a transaction between two beans.

Аттрибуты могут принимать значения:

  • Required

  • RequiresNew

  • Mandatory

  • NotSupported

  • Supports

  • Never

Сводная таблица

Table 33-1 В таблице 33-1 показано поведение контейнера исходя в различных ситуациях при различных значениях аттрибутов.

Таблица 33-1.

Значение аттрибута

Клиентская транзакция

Транзакция метода

Required

None

T2


T1

T1

RequiresNew

None

T2


T1

T2

Mandatory

None

error


T1

T1

NotSupported

None

None


T1

None

Supports

None

None


T1

T1

Never

None

None


T1

Error

Установка значения аттрибута

Аттрибуты определяюся с помощью анотации javax.ejb.TransactionAttribute, им присваивается одно из значений javax.ejb.TransactionAttributeType.

Можно аннотировать как отдельные методы, так и целые классы. Аннотация метода переопределяет аннотацию класса.
TransactionAttributeType содержит соответствующие значения:

  • Required: TransactionAttributeType.REQUIRED

  • RequiresNew: TransactionAttributeType.REQUIRES_NEW

  • Mandatory: TransactionAttributeType.MANDATORY

  • NotSupported: TransactionAttributeType.NOT_SUPPORTED

  • Supports: TransactionAttributeType.SUPPORTS

  • Never: TransactionAttributeType.NEVER

Ниже приведен пример использования аннотации

@TransactionAttribute(NOT_SUPPORTED)
@Stateful
public class TransactionBean implements Transaction {
...
@TransactionAttribute(REQUIRES_NEW)
public void firstMethod() {...}

@TransactionAttribute(REQUIRED)
public void secondMethod() {...}

public void thirdMethod() {...}

public void fourthMethod() {...}
}

Откат Container-Managed Transaction

Есть два способа откатить container-managed transaction. Первый: контейнер автоматически откатывает транзакцию, если брошен системный exception (в случае application exception откат не произойдет). Второй - можно вызвать метод EJBContext.setRollbackOnly.

Synchronizing a Session Bean’s Instance Variables

Интерфейс SessionSynchronization позволяет stateful session бинам получать синхронизационные уведомлени. Контейнер будет вызывать соответствующие методы (afterBegin, beforeCompletion, and afterCompletion) в нужное время.

Недозволенные методы Container-Managed Transactions

Не следует пользоваться следующими методами:
  • commit, setAutoCommit, rollback класса java.sql.Connection

  • getUserTransaction класса javax.ejb.EJBContext

  • любыми методами javax.transaction.UserTransaction

Если они вам необходимы, пользуйтеся application-managed transactions.

Bean-Managed Transactions

При использовании bean-managed transaction demarcation, вы должны явно определять границы транзакции. Главное преимущество по сравнению с container-managed является возможность определять несколько транзакций в одном методе.

Ниже приведен псевдокод примера

begin transaction
...
update table-a
...
if (condition-x)
commit transaction
else if (condition-y)
update table-b
commit transaction
else
rollback transaction
begin transaction
update table-c
commit transaction
Во время кодирования application-managed transaction, необходимо решить что использовать: JDBC или JTA транзакции.

JTA транзакции

JTA позволяет управлять транзакциями независимо от реализации. Сервер приложений реализует управление транзакциями с помощью Java Transaction Service (JTS).

Преимущество JTA в том, что можно охватывать несколько баз данных различных вендоров. Однако, Java EE transaction manager имеет ограничение: встроенные (nested) транзакции не поддерживаются. Другими словами, нельзя создать транзакцию для экземпляра, пока предыдущая не закончена.

Для определения границ транзакции вызываются методы begin, commit, and rollbac интерфейса javax.transaction.UserTransaction.

Возврат без коммита

В stateless session бинах с bean-managed transactions метод должен закоммитить или откатить транзакцию до возврата значения. Но stateful session bean не имеет такой обязанности.
В stateful session bean ассоциация бина и транзакции сохраняется между вызовами.

Запрещенные методы в Bean-Managed Transactions

Не вызывайте методы getRollbackOnly and setRollbackOnly интерфейса EJBContext, вместо этого используйте getStatus и rollback интерфейса UserTransaction.

Таймаут транзакции

Длч container-managed transactions можно использовать Admin Console для определения таймаута транзакций.

  1. В Admin Console -> Configuration -> Transaction Service.

  2. На одной из закладок можно выставить значение таймаута (в секундах). Если транзакция не завершилась в течении этого времени - она будет откачена. Значение по умолчанию равно нулю, т.е. транзакции не имеют таймаута.

Для bean-managed используйте метод UserTransaction.setTransactionTimeout

Обновление нескольких баз данных

Бинам разрешается обновлять несколько баз данных в пределах одной транзакции. Ниже на рисунках показаны два возможных сценария.


На рис. 33-2 все обновления происходят в одной транзации.

Figure 33-2
A diagram showing Bean-A updating databases X and Y, and Bean-B updating database Z.


Во втором случае (рис. 33-3), transaction managers Java EE сервера также гарантирует, что все обновления произойдут в пределах одной транзакции.

Figure 33-3
A diagram showing Bean-A on one Java EE server updating database X, and Bean-B on another Java EE server updating database Y.


Транзакции в Web компонентах

Вы можете определять транзакции в web-компонентах использую java.sql.Connection или javax.transaction.UserTransaction. Использование аналогично использованию в session beans.

среда, 14 мая 2008 г.

Критерии

Столкнулся с выборкой данных по критериям.

Если необходимо отобрать объекты по нескольким полям, поступаем просто:
Session session = (Session) em.getDelegate();
Criteria criteria = session.createCriteria(Payment.class);

criteria.addOrder(Order.desc("paymentDate"));
criteria.add(Restrictions.eq("id", request.getPaymentId()));
criteria.add(Restrictions.ge("paymentDate", request.getSince()));
criteria.add(Restrictions.le("paymentDate", request.getTill()));

return criteria.list();
Все просто, все понятно.
Но если необходимо отобрать записи не по полю объекта, а по полю объекта, на который ссылается данный?

В этом случае правильное рещение выглядит так (допустим, что entity Payment имеет ссылку на entity Account)
criteria = criteria.createCriteria(Payment.class);

// добавляем отбор по полям класса Payment

// Опускаемся к объекту Account
criteria = criteria.createCriteria("Account");

// Добавляем отбор по полям Account
criteria.add(Expression.eq("accountNumber", 123));
Но если нужно сделать отбор по embedded полю, поступить следует так:
criteria.add(Restrictions.eq("account.accountNumber", 123));

среда, 30 апреля 2008 г.

Старые записи

Туту буду размещать заметки, ссылки, размышления об IT. Возможно, что-то будет на английком. Старые тематические записи можно найти в старом блоге по меткам:
http://anevseev.blogspot.com/search/label/Java
http://anevseev.blogspot.com/search/label/design%20pattern
http://anevseev.blogspot.com/search/label/development
http://anevseev.blogspot.com/search/label/Hibernate
http://anevseev.blogspot.com/search/label/linux
http://anevseev.blogspot.com/search/label/EJB
http://anevseev.blogspot.com/search/label/jboss

Тест

Тест