Command pattern

Я предпочитаю переводить pattern как "тропинка". Тропинки в программировании это общие закономерности которые прокладывают разные программисты для решения похожих задач.

Command pattern оказывается нужным когда понятие "комманды" становится более чем просто вызовом функции. Например когда надо делать undo, транзакции внутри программы, правильную полоску установки (installer progress bar), когда надо делать многостраничный опросник (wizard), когда хочется записать то что делает пользователь или наоборот выполнить пользовательские команды (macro).

В коде такая тропинка отличается тем что комманда становится классом. А точней делается интерфейс Command, и уже от него создаются конкретные комманды. Конкретные комманды могут не просто делать что-то по себе, но и иметь внедрённый (incapsulated) связанный объект. Я конечно в качестве примера беру игру WoW где охотник может поставить ловушку, которая сработает когда на неё наткнётся противник.

 

Системы бизнес-правил

Побывал сегодня на devclub, где презентацию проводил Кирилл Литник из Webmedia, поэтому я делаю маленький пересказ.

BRMS - системы по управлинию бизнес правилами. А бизнес правила это любые правила которые есть в предприятии. В простых проектах  зачатком этого можно считать динамические настройки.

Примерами таких систем являются iLog, Drools. Примером использования таких систем может служить случай когда на Ebay сразу после падения станции Мир были запрещены продажи его остатков. Системы активно используются в банках и телекоммуникационных компаниях (Visa, JPMorgan).

Нужны такие системы когда правил (if-else) в коде очень много или же правила надо менять без изменения кода приложения, через web-приложение. Ещё они полезны когда есть старые legacy-системы (доставшиеся по наследству) которым по 15 лет, скажем в PLSQL и необходимо модернизировать логику и приложение.

iLog состоит из

  • Rule studio - плагин для Eclipse где настраиваются
  • Rule team server - веб среда. Можно лочить правила что-бы никто не изменил. Есть версионность правил.
  • Rule Scenario Manager - среда для проверки правил, в том числе правила которые невозможно исполнить, их пересечение и тп.
  • Rule repository
  • Rule execution server - имеются два типа исполнения правил - embedded тип, либо как компонент jar (что менее удобно).

JMS-клиент приложение на Java

Недавно я писал про соединение Flex и JMS, об расширенных возможностях этого соединения по сравнению с ajax. Недавно я узнал что кроме Jboss есть ещё и WebORB и Bea Weblogic в качестве серверов приложений, которые поддерживают и Java и .NET, первый даже php и ruby. А JMS в свою очередь - часть семейства приложений Message Oriented Middleware.

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

Но сегодня пишем простое клиентское приложение по работе с службой сообщений, в которую в прошлый раз поступило сообщение из Flex. Для этого нам понадобится Eclipse IDE, настроенный в прошлый раз Jboss сервер и голова на плечах.

Eclipse

Проект

Первым делом - создаём новый java-проект в Eclipse, куда ставим код который я привожу ниже в приложении. Проект и ответсвенный класс я назвал jms_client. К этому времени запуск приведёт к ошибкам типа java.lang.NoClassDefFoundError , а всё дело в том что к проекту надо импортировать библиотеку javax.jms.*

Странным образом я не смог найти чёткого описания где её достать. Даже установив Development kit и Runtime enviroment 1.6.0.07 и Enterprise Edition Software Development Kit 5, я лишь значительно позже додумался присоединить к проекту внешние JAR-библиотеки из jboss/client/

Пример архитектуры JMS приложения

 

Многопоточность в Java

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

Главные методы класса Thread:

  • yield - отказ от процессорного времени - другие процессы могут работать.
  • sleep - спящий поток (в миллисекундах), при этом другие процессы ждут, может быть насильно прерван, поэтому ставится в try-конструкцию
  • interrupt - разбудить поток
  • join - установление зависимости между потоками.. зависящий поток должен ждать окончания главного

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

  • getPriority, setPriority методы позволяют установить и прочитать важность потока относительно остальных
  • setDaemon, isDaemon - методы создающие демонов как потоки, при закрытии которых программа остановит обычные потоки

Особенность synchronized ещё и в том, что фигурными скобками можно отметить блок который должен быть атомарным (а не только отдельный метод). По умолчанию обычный статичный метод main, так же считается потоком.

Файлы

Соединяем Java и Oracle

Я недавно писал о том как соединялся с Postgre из servlet'ов, на этот раз я использую среду разработки JDeveloper, библиотеку интерфейсов Swing и конечно базу данных Oracle. Бесплатная версия express edition, по аналогии с microsoft'ными XE очень ограниченная и загружающая активно память - на лаптопы ставить не советую. К счастью у меня есть удалённый сервер в университете, который можно эксплуатировать.

После создания Swing-проекта и добавления Oracle драйверов-библиотек, пишем "conn" в качестве параметра запускаемого класса, нажимае Ctrl+Enter и получаем примерно такой код:

public static Connection getConnection() throws SQLException { //Удобней так указывать исключение (exception) на случай ошибки
    String thinConn = "jdbc:oracle:thin:@localhost:1521:ORCL"; //thin - тип драйвера, ORCL - имя сессии
    DriverManager.registerDriver(new OracleDriver());
    Connection conn = DriverManager.getConnection(thinConn,"Scott","Tiger");
    conn.setAutoCommit(false); //по умолчанию запросы БД выполняются только после ручного подтверждения - Commit'а
   return conn;
}