воскресенье, 19 сентября 2010 г.

GearMan: распараллелевание и комуникация

Если вы сталкиваетесь с ресурсоемкой задачей, то приходится решать вопросы связанные с балансом нагрузки внутри системы, риском единой точки отказа , повышением скорости ответа системы и т.д. Для этого используются вспомогательные системы очередей сообщений. Прочитать про подобные системы можно в статье "Очередь сообщений - что это и зачем?". В нашем текущем проекте мы используем сервер Gearman для организации и распределения задач, по сути это сервер очереди сообщений. Кроме всего прочего сервер имеет реализации API для разных языков, это Perl, PHP, Python, Java, C#/.NET, а так же для JMS и баз данных PostgreSQL и MySQL.
В двух словах что же представляет собой работа с применением сервера Gearman.  Сервер является диспетчером сообщений к которому присоединяются клиентские части системы. Эти части делятся на два вида, назовем их воркеры и клиенты. Воркеры это части системы которые производят некоторую обработку данных, эту обработку и требуется распараллелить. Клиенты это части системы, которые требуют некой обработки данных и ради этого используют воркеры через сервер Gearman. Как это выглядит в проекте? Сложные ресурсоемкие процессы реализованы на Java и являются воркерами. Вэбклиент PHP использует эти процессы через сервер Gearman. Благодаря наличию API для разных языков программирования можно организовать эффективное взаимодействие внутри очень сложной системы с высоким уровнем изоляции частей друг от друга.
Что потребуется для подключение к серверу Gearman? Понадобится сам сервер и коннектор к нему для Java. Коннектор скачать можно вот отсюда. С ним все просто, достаточно подключить jar как библиотеку к своему проекту, при желании можно порыться в исходниках. При установки самого сервера могут потребоваться добавочные реепозитории. В этом вам могут помочь, особенно если вы используете Ubuntu, следующие ссылки: статья блога PHP+Gearman и некая документация.
С чего начать? Для начала не требуется какого-то массового курения мануалов. Достаточно заглянуть в пример, который идет вместе с коннектором в том же jar файле. Для этого изучите содержимое пакета  package org.gearman.example;
 
В качестве демонстрации простоты использования приведу несколько строк кода.
Worker: создать воркер из класса "WorkerClass" и зарегистрировать его

       List<Сlass<GearmanFunction>> functions = new ArrayList<Class<GearmanFunction>>();

       Class c = null;

       try {

           c = Class.forName(WorkerClass.class.getCanonicalName());

       } catch (ClassNotFoundException ex) {

       }

       functions.add((Class) c);

       new WorkerRunner(host, port, functions).start();





Client: создать клиента и вызвать необходимый воркер


         final GearmanClient client = new GearmanClientImpl();
        boolean addJobServer = client.addJobServer(new GearmanNIOJobServerConnection("192.168.0.0", Constants.GEARMAN_DEFAULT_TCP_PORT));
        byte[] data = ByteUtils.toUTF8Bytes("some data");
        GearmanJobResult res = null;
        final GearmanJob job = GearmanJobImpl.createJob(WorkerClass.class.getCanonicalName(), data, nill);
        client.submit(job);
        try {
            res = job.get();
        } catch (InterruptedException ex) {
            System.err.println(ex);
        } catch (ExecutionException ex) {
            System.err.println(ex);
        }
        String value = ByteUtils.fromUTF8Bytes(res.getResults());
        rc.shutdown();

пятница, 4 июня 2010 г.

JavaFX + Swing + Composer. Как встроить swing-контрол в форму JavaFX с использованием плагина Composer для NetBeans

JavaFX представляет собой достаточно новую и перспективную платформу создания визуальных интерфейсов с возможностью их использования как в web-приложения, так и в dektop. Палитра визуальных компонентов на данный момент в JavaFX весьма скудна и сами разработчики JavaFX рекомендуют использовать в качестве недостающих компоненты Swing. Встал вопрос: как добавить на форму JavaFX обычный компонент Swing. Для ускорения разработки визуальной части в NetBeans существует плагин Composer. Я использую этот плагин и отказываться от него мне не хотелось. Посмотрим что же в итоге получилось.

1. Как подготовить компонент Swing для размещения его на форме JavaFX.
//Создание нашего Swing контрола
var myB = new JButton();
//Сделаем наш контрол встраиваемым в приложение JavaFX с графической сценой
var myJavaFXB = SwingComponent.wrap(myB);
2. Как поместить наш подготовленный контрол в JavaFX сцену.
Класс сцены javafx.scene.Scene имеет поле content, который является списком всех контролов, лежащих в этой сцене. Наша задача поместить подготовленный нами Swing контрол в этот список.

3. Что делать если используем Composer.
Этот плагин помогает конструировать визуальную часть, при этом он генерирует часть кода, которая не доступна для редактирования из NetBeans. По моему, это очень замечательно, но требует изучения мысли разработчиков этого самого плагина. Найдем код, среди того что редактировать нельзя, который отвечает за класс нашей сцены с компонентом Swing. Выглядеть он может примерно так:
masterScene = javafx.scene.Scene {
            width: 640.0
            height: 480.0
            content: javafx.scene.layout.Panel {
                content: getDesignRootNodes ()
            }
};
Тут masterScene это моя визуальная сцена, куда требуется поместить контрол Swing. Прочитаем еще раз пункт 2 этой статьи. Мы имеем content, но не можем дописать эту часть кода прямо здесь, она не редактируемая.
Теперь откроем визуальный редактор Composer для редактирования нашей формы. В инспекторе объектов создаем метод, отрабатывающий по завершению создания нашей сцены. См. рис.
Теперь мы имеем метод, в который необходимо поместить логику добавления нашего подготовленного контрола в сцену. Примерно так.
 //нередактируемый код
masterScene = javafx.scene.Scene {
            width: 640.0
            height: 480.0
            content: javafx.scene.layout.Panel {
                content: getDesignRootNodes ()
            }
};
scenePost_CreationCode(); // <-- вызов нашего только что добавленного метода

... ... ...
// наш только что добавленный метод
function scenePost_CreationCode(): Void {
        // Предварительно установим некоторый значения и расположение на форме
        myB.setText("Нажми меня");
        myJavaFXB.height = 25;
        myJavaFXB.width = 75;
        myJavaFXB.layoutX = 10;
        myJavaFXB.layoutY =10;
        // Добавим наш подготовленный контрол в список сцены.
        insert myJavaFXB into getDesignScene().content;
}
Вот, собственно, и все.

четверг, 8 апреля 2010 г.

Sun Tech Days 2010. День первый.

И так. Вот и случилась международная конференция STD-2010. Первый день уже минул. Давайте попробуем вспомнить что же происходило в этот день и какие результаты и выводы имеем в итоге.

Все началось с обозначения целей мероприятия:
  1. Рассказать сообществу о новых тенденциях в IT
  2. Живое общение специалистов
  3. Дать толчок для разработки, получить новый импульс.
И так по пунктам в конце первого дня. Что нового у нас в тенденциях? Может для кого-то это не новость, но мне сильно бросилось в глаза агрессивное поведение Oracle. Не скажу что это плохо, наверное, даже хорошо для бизнеса такого уровня. А конкретно тенденции следующие. Java активно приобретает черты и механизмы коммерции. Набирает обороты JavaStore, естественно начиная с Америки. Для нас с вами уже существует Java Warehouse, пока в тестовом режиме и без коммерческой составляющей, но всё же. Второй момент это активное развитие JavaFX. Я так скажу, все это мероприятие в основном направлено дать мощный толчок развитию программирования с применением JavaFX. Эта технология становится прямым конкурентом SilverLight. Развиваются средства разработки UI с применением JavaFX. Короче, главная тема сегодня - JavaFX повсюду. Лично я возвращаюсь в Москву и ныряю с головой в эту тему.
А как с общением? Разумеется, основные доклады на английском языке, это несколько осложняет общение с докладчиками. Но мне не понравилось следующее: поговорить особо не с кем. В основном на конференции одни студенты и сама обстановка не располагает к общению между посетителями. Но вот на тематических сдендах можно было поговорить со специалистами и выяснить все интересующие вас вопросы. Думаю этого не мало, но живых дискуссий по темам я что-то не заметил, возможно такой задачи организаторами и не ставилось.
Теперь посмотрим какие импульсы были даны в первый день. Я вам не скажу за всю Одессу, вся Одесса очень велика, но я пару таких импульсов получил однозначно. Во первых это JavaFX. Во вторых это пересмотр своего отношения к UI . Конкретных и бесповоротных выводов делать рано, но обдумать и попробовать применить уже пора.

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

Завтра продолжение. Посмотрим, послушаем. Вполне вероятно что можно будет услышать еще про какую-нибудь очень интересную вещь, если такая попадется,то я обязательно про нее напишу.