Сбор данных в режиме реального времени: Как подключить свой велотренажер к базе данных Informix или DB2

Использование Java и Linux для сбора данных в режиме реального времени

Сконструируйте систему для сбора данных из аналоговой среды в режиме реального времени и сохраните полученную информацию в базе IBM® Informix® Dynamic Server или DB2®. С помощью WebSphere® Application Server Community Edition постройте графическое изображение полученных данных и опубликуйте его, используя Java™ Server Pages. Все необходимые шаги, включая установку и подключение магнитных сенсоров, настройку компьютерного интерфейса, код клиента OLTP и JSP-код для презентации конечных результатов детально описаны в предлагаемой статье.

Арон Лурье, ученик 10 класса/Web-мастер, Newton South High School/Hebrew College

В то время, когда писалась эта статья, Арон Лурье был учеником десятого класса. Вот уже 5 лет как он профессионально занимается Web-разработками в качестве владельца собственного бизнеса. Начиная с 4-го класса, Арон самостоятельно изучает языки программирования. Арон – Web-мастер школьной газеты, кроме того, он был Web-мастером в своем подразделении United Synagogue Youth и Hebrew College. В свободное время Арон увлекается бегом на лыжах и выступает за команду Newton South. К сожалению, пока еще он не нашел способ объединить лыжи с компьютером.



Марти Лурье, специалист в области информационных технологий, WSO2 Inc

Марти Лурье начал свою компьютерную карьеру с изготовления конфетти, набивая на перфокарты свои программы на Fortran’е для IBM 1130. Свой рабочий день он проводит в департаменте Systems Engineering подразделения IBM Software Division, однако под давлением готов признаться, что в основном он просто играет с компьютерами. Его самая любимая программа – та, которую он написал, чтобы подключить свой портативный компьютер к тренажеру Nordic Track (в результате компьютер сбросил 2 фунта, а его уровень холестерина снизился на 20%). Марти – обладатель сертификатов IBM WebSphere Administrator, DB2 DBA, Business Intelligence Solutions Professional и SOA Solution Designer, а также сертификатов Linux Administrator и Informix Professional.



14.01.2009

Введение

Окружающий нас мир представляет собой непрерывное пространство, аналоговую среду. В отличие от него компьютерная среда – пространство дискретное. Эта статья рассказывает, как получить данные из аналоговой среды в режиме реального времени и сохранить их в базе данных Informix® Dynamic Server или DB2®. Узнайте, как с помощью ноутбука и клиента Informix/DB2 OLTP обработать аналоговые сигналы. С помощью WebSphere® Application Server Community Edition создайте графики на основе полученных данных и опубликуйте их в Java™ Server Pages. Следуйте указаниям авторов статьи для установки и подключения магнитных сенсоров и настройки компьютерного интерфейса, воспользуйтесь предлагаемым кодом OLTP-клиента и кодом JSP для презентации полученных результатов в наглядной форме.

Сбор данных: Непрерывность против дискретности

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

Что такое системы реального времени?

Термин «система реального времени» имеет множество интерпретаций. Основным критерием для определения действительно ли система является системой реального времени, является вопрос быстродействия: достаточно ли быстра система, для того, чтобы соответствовать потоку данных, которые она должна собирать и обрабатывать? Стандартная дистрибуция Linux®, на которой работает Informix ил DB2, а в качестве языка программирования используется Java, имеет достаточно широкий диапазон времени обработки. Планировщик задач, синхронизация файловой системы, контрольные точки баз данных, сборка мусора Java-приложений и многие другие факторы сообща могут значительно увеличить время отклика системы.

Однако есть и хорошая новость: если наибольшее время отклика все же существенно меньше жизненного цикла реальных событий, для обработки которых предназначена данная система, то такая система удовлетворяет определению систем реального времени, опубликованному в Википедии: «Операционная система реального времени … - ОС, в которой успешность работы любой программы зависит не только от её логической правильности, но и от времени, за которое она получила этот результат».
Классическая концепция такова: в системах жёсткого реального времени обработка события дольше установленного времени не имеет смысла – это может привести критическому сбою всей системы в целом. Системы мягкого реального допускают задержки в обработке события, что может привести к снижению качества работы системы (например, пропущенные кадры при показе видео).

Если наша система пропустит один оборот педали – это еще не катастрофа. Вот если антиблокировочная тормозная система вашего автомобиля не успевает обрабатывать входные данные - это гораздо более серьезный повод для беспокойства.

Конечно, мы не ждем, что каждый человек, ознакомившись с данной статьей, тут же ринется подключать свои тренажеры к компьютеру (если вы уже начали подключение, мы рекомендуем проконсультироваться с вашим лечащим врачом, прежде чем начать запись данных в базу). Основная цель статьи – помочь вам понять основные принципы получения и обработки данных в режиме реального времени. Эти же принципы применимы к онлайновой обработке транзакций (online transaction processing - OLTP). Вопросы быстродействия системы и наибольшего времени обработки как средства определения трансактной производительности приложения-агента имеют самое широкое применение.


Архитектура

Конструкция, изображенная на рисунке 1 представляет готовый дизайн нашей системы. Слева на рисунке изображен велотренажер, который выступает в качестве источника аналогового сигнала в режиме реального времени. Велотренажер подключен к аналого-цифровому преобразователю. В нашем случае это простой магнитный переключатель, соединенный с компьютерной мышкой. Как только событие аналоговой среды (полный оборот педали тренажера) получит свое цифровой представление (щелчок мышки), наше программное приложение сможет начать обработку этого сигнала.

Рисунок 1. Архитектура системы
Рисунок 1. Архитектура системы

Изображенное на рисунке приложение-клиент на Java – это программа, работающая с командной строкой. Web-интерфейс нам здесь не понадобится. Программа реагирует на щелчок мышки, сгенерированный аналоговым устройством, и добавляет соответствующую строку в базу данных Informix или DB2, изображенную на рисунке темно-синим цветом. В качестве приложения для онлайновой обработки транзакций IBM рекомендует платформу Informix. Перенос предлагаемого кода на другие платформы, например DB2, достаточно прост, соответствующий код вы можете найти в примерах, прилагаемых к данной статье. Обсуждение вопросов портирования кода на Informix и DB2 можно найти в разделе Ресурсы.

В правой части рисунка - система для публикации результатов. В данной статье для генерации отчетов используется WebSphere Application Server Community Edition. Подробную информацию об этом Java EE сервере можно найти в разделе Ресурсы. В процессе тестирования производительности системы вы узнаете, почему мы предпочли использовать график полученных от велотренажера данных в виде файла .jpg, вместо того чтобы генерировать постраничные динамические изображения. Кроме того, вы узнаете о преимуществах использования компонента Web2/Ajax и JavaScript для обновления фрагмента страницы, содержащего графическое изображение, без перезагрузки всей страницы целиком.


Преобразование аналогового ввода в дискретный

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

Выбранные нами аппаратные средства обеспечивают замечательно простой метод перевода информации из аналоговой в дискретную форму. Поскольку мы используем простой импульсный сигнал, то для передачи сигнала компьютеру, устранения «дребезга» переключателя, подключения к источнику питания и необходимым программным драйверам нам достаточно компьютерной мышки или Zeemote® (игрового Bluetooth® контроллера). Благодаря этому наша экспериментальная система очень проста. К сожалению, система устранения «дребезга» переключателя не всегда работает идеально, так что на графике время от времени могут появляться случайные пики, вызванные слишком быстрой частотой вращения.

Использование компьютерной мышки для передачи дискретного сигнала

Компьютерные мышки являются объектом множества экспериментов. Поиск строки «mouse hacking» в Google обнаружил более полумиллиона совпадений. Для нашего проекта нам нужно параллельно подключить магнитный переключатель к правой кнопке мышки. На рисунке 2 показан вольтметр, измеряющий напряжение в монтажной плате, соединенной с правой кнопкой мышки. Да, это действительно правая кнопка, плата инвертирована.

Рисунок 2. Определение точки подключения к правой кнопке мышки
Рисунок 2. Определение точки подключения к правой кнопке мышки

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

Рисунок 3. Провода присоединены к левой и правой кнопкам мышки
Рисунок 3. Провода присоединены к левой и правой кнопкам мышки

Вторые концы проводов, присоединенных к кнопкам мышки, подключены к обычному стерео-разъему. Как это не удивительно, но нам удалось заново собрать мышку, не оставив при этом никаких лишних деталей! На рисунке 4 показаны собранная мышка, стерео-коннектор и стерео-шнур для соединения male-to-male.

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

Рисунок 5 демонстрирует магнитные переключатели, присоединенные к стерео-шнуру и магнит, используемый для собственно переключения. Этот магнит нужно установить на рычаг педали велотренажера. Для нашего проекта достаточно использовать переключатель, соединенный с левой кнопкой мышки. Дополнительные усилия, затраченные на пайку проводов к обеим кнопкам, были минимальны, и, безусловно, оправдают себя при использовании второго сенсора в каком-нибудь другом проекте.

Рисунок 5. Магнитный переключатель, магнит, соединительные провода
Рисунок 5. Магнитный переключатель, магнит, соединительные провода

На рисунке 6 показана установка переключателя и магнита. Обратите внимание, что маленький белый магнит, изображенный на рисунке 5, был заменен более мощной версией промышленного уровня. Вы можете видеть верхнюю часть переключателя, закрепленного на стойке велотренажера. Для надежного крепления магнита и переключателя мы воспользовались прозрачным скотчем. Обычная клейкая лента оказалась слишком грубой и неподходящей для нашего эксперимента.

Рисунок 6. Магнитный сенсор и магнит, установленные на велотренажере
Рисунок 6. Магнитный сенсор и магнит, установленные на велотренажере

Использование Zeemote – беспроводного Bluetooth устройства

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

Как гласит информация, размещенная на сайте Zeemote , «Zeemote®, Inc создает интеллектуальные беспроводные контроллеры для мобильных устройств. Наш первый продукт, запатентованный Zeemote® JS1, представляет собой первый компактный беспроводной джойстик для мобильных игр. Небольшой, быстрый, эргономичный и беспроводной, контроллер Zeemote® является аналоговым устройством управления и обеспечивает высокий уровень реализации игровых функций, сравнимый по возможностям с полноценным компьютерным терминалом».

Рисунок 7. Джойстик Zeemote
Рисунок 7. Джойстик Zeemote

Нам удалось раздобыть инженерную версию Zeemote со всеми необходимыми подключениями для использования в нашем проекте. На рисунке 8 компьютерная мышка заменена джойстиком Zeemote, который обеспечивает передачу дискретного сигнала Java-клиенту по беспроводному Bluetooth® соединению. Читатель может самостоятельно разработать свой собственный интерфейс для преобразования аналогового сигнала в дискретный.

Рисунок 8. Прототип Zeemote, подключенный к магнитному сенсору
Рисунок 8. Прототип Zeemote, подключенный к магнитному сенсору

Java-клиент для сбора данных

При каждом повороте педали мышка генерирует один щелчок в окне, на котором в данный момент установлен фокус. Для сбора данных о велотренажере вам нужно записать информацию о щелчке мышки в базу данных. Это может быть реализовано благодаря использованию Java-окна, слушающего щелчки. Каждый раз, когда происходит щелчок мышкой, клиент реагирует на это событие добавлением строки в базу данных через JDBC. В таблицу заносится точное время щелчка и другая полезная информация. Для того чтобы реализовать эту функциональность, в первую очередь мышка должна быть расположена в соответствующем окне. Рисунок 9 демонстрирует пример простого окна для определения оборота педали.

Рисунок 9. Java-окно для обработки щелчка левой кнопки мышки
Рисунок 9. Java-окно для обработки щелчка левой кнопки мышки

На листинге 1 показан код Java класса, который обрабатывает щелчки мышки. Код включает в себя версии для Informix и DB2 и может быть скачан в разделе Загрузка.

Листинг 1. Java-клиент для сбора данных, Informix/DB2
import java.awt.*;
import java.awt.event.*;

import java.sql.*;

public class BikeListen extends Frame implements MouseListener, WindowListener {
    private PreparedStatement pst;
    //Переменные, описывающие скорость вращения педали
    private long lastSpin, spinDiff,thisSpin=System.currentTimeMillis();
    //Переменные метода timer
    private long timerStart, timerFinish, timerDiff, totalTimes, numTimes=0, maxTime;
    private final long MILLISECONDS_PM = 60000;
    private Connection conn;

    
    public BikeListen(){
        //Определяем URL-адрес базы данных
        String jdbcurl = "jdbc:informix-sqli://192.168.3.51:54321:"+
	   "informixserver=f_ids;user=informix;password=YOUR#PASS#HERE;database=rpm";
       
         //Загружаем ifx-драйвер
        try{
             Class.forName("com.informix.jdbc.IfxDriver");
         }
         catch (Exception e){
             System.out.println("FAILED: failed to load Informix JDBC driver.");
         }
        
         //Устанавливаем соединение с базой данных
         try{
             conn = DriverManager.getConnection(jdbcurl);
         }
         catch (SQLException e){
             System.out.println("FAILED: failed to connect!");
         }

         //Для повышения производительности заранее готовим sql запрос
		 //на добавление строки
         try{
             pst = conn.prepareStatement
	("insert into revs( timestamp, rpm, milliseconds )  values (current, ?, ? )");
         }
         catch (SQLException e){
             System.out.println("FAILED to prepare statement  : " + e);
         }
       
        setSize(500, 500);
        //Добавляем слушателя щелчков и функцию закрытия окна
        addMouseListener(this);       
        addWindowListener(this);
       
        setTitle("Point mouse inside window before you start riding");
        System.out.println("Point mouse inside window before you start riding");
        setVisible(true);
    }
   
   
    public void mousePressed(MouseEvent e) {
        //Запускаем таймер для определения времени обработки сигнала
        timerStart = System.currentTimeMillis();
       
        double rpm = 0;
        //В lastSpin хранится предыдущее значение thisSpin
        lastSpin = thisSpin;
        //thisSpin соответствует текущему времени
        thisSpin = System.currentTimeMillis();
        //Разница между ними определяет время, за которое педаль совершила один оборот
        spinDiff = thisSpin - lastSpin;
        if (spinDiff > 0)
            rpm = MILLISECONDS_PM/spinDiff;
        //Проверяем, какая кнопка мышки щелкнула – правая или левая
        if (e.isMetaDown())
            //System.out.println("Right pressed, " + spinDiff);
            ;
        else{
            //Теперь вставляем данные в базу
            try {
               
                pst.setInt (1, (int)rpm );
                pst.setInt (2, (int)spinDiff );
                pst.addBatch();
                pst.executeBatch();
            }
            catch (SQLException einsert){
                System.out.println("FAILED to Insert into tab: " + e.toString());
            }
        }
       
        if (numTimes % 10 == 0)
            System.out.println("");
        System.out.print("·");
       
        //Останавливаем таймер
        timerFinish = System.currentTimeMillis();
        timerDiff = timerFinish - timerStart;
        numTimes++;
        //Добавляем значение таймера к суммарному времени
        totalTimes = totalTimes + timerDiff;
        //Если это новое максимальное время обработки сигнала, выводим его на печать
        if (timerDiff > maxTime){
            maxTime = timerDiff;
            System.out.println("\nNew max time: " + maxTime);
        }
       
       
    }
    public void mouseReleased(MouseEvent e){;}
    public void mouseEntered(MouseEvent e){;}
    public void mouseClicked(MouseEvent e){;}
    public void mouseExited(MouseEvent e){;}
   
    //Слушатель событий для кнопки
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
    public void windowActivated(WindowEvent e){;}
    public void windowDeactivated(WindowEvent e){;}
    public void windowOpened(WindowEvent e){;}
    public void windowClosed(WindowEvent e){;}
    public void windowDeiconified(WindowEvent e){;}
    public void windowIconified(WindowEvent e){;}
   
    public static void main(String args[]){
        BikeListen bl = new BikeListen();
    }
   
}

Для преобразования щелчка мышки в строку в базе данных, класс BikeListen должен выполнить несколько операций. Во-первых, он должен перехватить щелчок мышки. Это достигается за счет расширения класса Frame и непосредственно создания и открытия окна для мышки. Благодаря реализации детектора событий мышки MouseListener и переопределению mouseClicked(MouseEvent e) класс создает метод, который вызывается каждый раз, когда происходит щелчок мышки в окне расширенного класса Frame. Для того чтобы Frame вызывал переопределенный нами метод mouseClicked(MouseEvent e), слушатель класса Frame должен быть определен как "this" – см. соответствующий код в конструкторе: addMouseListener(this). Кроме того, в класс добавлена реализация метода WindowListener для того, чтобы пользователь мог закрыть окно и выйти из программы.

Кроме того, конструктор класса выполняет несколько подготовительных шагов для занесения информации в базу данных. Он определяет URL базы данных для JDBC, а затем пытается загрузить драйвер, установить соединение с базой данных и заранее подготовить SQL-запрос, чтобы ускорить в дальнейшем процесс обмена данными с базой. После этого все, что требуется от mouseClicked() – это получить текущее значение времени, используя System.currentTimeMillis(), найти разницу между текущим и предыдущим значениями и, следовательно, определить скорость вращения педали, а затем вставить эти значения в таблицу базы данных, используя заранее подготовленный запрос. Для измерения и последующего анализа скорости взаимодействия с базой данных можно установить дополнительный таймер, задача которого – измерить время, необходимое для соединения с базой и внесения новых данных. Эта функциональность обсуждается ниже.

На другом конце у нас есть база данных для получения и сохранения информации в сравнительно простой таблице "revs". Структура таблицы приведена в листинге 2.

Листинг 2. Структура таблицы Informix для хранения данных, поступающих в режиме реального времени от сенсоров
create table revs (
	revkey serial,
	timestamp datetime year to fraction,
	rpm    int,
	milliseconds int
);
Листинг 3. Структура таблицы DB2 для хранения данных, поступающих в режиме реального времени от сенсоров
create table revs (
	revkey int generated always as identity,
	tstamp timestamp,
	rpm    int,
	milliseconds int
);

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

Еще один важный аспект создания приложения, работающего в режиме реального времени, – сбор мусора (Java garbage collection – gc). Воспользуемся средством диагностики jconsole, чтобы получить наглядный график, отражающий процесс сбора мусора (Рисунок 9). Каждый резкий спад объема используемой памяти создает пилообразный уступ графика и соответствует циклу gc. Если же в целом график отражает медленный рост объема потребляемой памяти, то это скорее всего сигнализирует о возможной утечке! Более подробную информацию о работе jconsole можно найти в разделе Ресурсы.

На рисунке 10 показан график Jconsole, отображающий процесс сбора мусора Java клиента.

Рисунок 10. Мониторинг процесса сбора мусора Java-клиента с помощью Jconsole
Рисунок 10. Мониторинг процесса сбора мусора Java-клиента с помощью Jconsole

Генерация отчета с использованием JSP, Ajax и Web 2.0

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

Регулярное создание изображения в фоновом режиме вместо генерации новой картинки в ответ на запрос по обновлению страницы отчетов подробно рассматривается в статье DB2/Informix and open source: Database defense against the dark political arts , в частности в листингах 9 и 10, приведенный в указанной статье.

Для публикации данных о работе велотренажера в виде картинки вам понадобится генератор графического изображения, сервер создания отчетов и механизм обновления.

Создание графиков в Java: JFreeChart

JFreeChart– замечательный пакет библиотек для создания графических изображений c использованием Java. Согласно информации, размещенной на сайте проекта JFreeChart, «JFreeChart – абсолютно бесплатная графическая библиотека Java, позволяющая разработчикам программных приложений создавать изображения самого высокого качества».

Таким образом, Java-приложение будет регулярно создавать графическое изображение информации о вращении педали велотренажера. Исходный код XYjdbc.java, прилагаемый к этой статье, демонстрирует способ создания .jpg-файла. Конечно, JFreeChart может использоваться непосредственно на Web-странице для динамической генерации картинки, однако в этом случае производительность будет падать по мере роста числа пользователей, обращающихся к этой Web-странице.

Сервер приложений: WebSphere® Community Edition

В качестве сервера приложений в нашем проекте используется WebSphere Application Server Community Edition (см. Ресурсы).

Для отображения результатов эксперимента мы использовали простую JSP-страницу со встроенным JavaScript. Результат показан на рисунке 11.

Рисунок 11. Java Server Page для демонстрации данных о вращении педали в Eclipse
Рисунок 11. Java Server Page для демонстрации данных о вращении педали в Eclipse

Эта страница открыта в среде Eclipse, рекомендуемой для разработки приложений для WebSphere Application Server Community Edition. Информацию о подключаемых модулях Eclipse, которые могут оказаться полезными при создании приложений для WebSphere Application Server Community Edition, можно получить здесь.

Механизм обновления: Web 1.0 против Web 2.0 и Ajax

Создание графического файла – вещь довольно бесполезная, если у нас нет способа публикации изображения. Аналогично, все разговоры об отображении данных в режиме реального времени теряют свой смысл, если графическое изображение не может обновляться в реальном времени. Поскольку картинка публикуется в браузере, определенные части страницы должны постоянно обновляться, чтобы демонстрировать обновленное изображение. В «чистом» HTML варианте эта проблема решается довольно просто – надо добавить еще одну строчку к заголовку страницы, которая скажет браузеру о необходимости обновлять контент каждые несколько секунд. Например, вот так:

Обновление в Web 1.0
<META HTTP-EQUIV=Refresh CONTENT="1; URL=autorefresh.html">

Web 1.0 предоставляет функцию авто-обновления, однако эта функция реализована через запрос get для всей страницы в целом.

В мире современных технологий Web 2.0 обновление всей страницы целиком, в то время как требуется обновить лишь один фрагмент с графиком, рассматривается как совершенно недопустимое снижение скорости загрузки и является дурным тоном. Вместо этого рекомендуется использовать более элегантное решение – Web-страница с JavaScript, который каждые несколько секунд получает новый график и отображает его на странице, не меняя остальных фрагментов и не оказывая какого-либо заметного влияния на скорость загрузки.

Для многих подобный тип «фокусного» обновления ассоциируется с AJAX, однако поскольку речь идет об обновлении изображения, нам не потребуется вызывать какой-либо скрипт и получать в результате XML-контент. Вместо этого мы используем технологию JavaScript "document.images", которая позволяет менять источник изображения. Однако и здесь есть своя тонкость: если вы зададите имя файла с предыдущим графическим изображением и не замените его на новое имя файла, браузер не будет загружать обновленный график, а воспользуется изображением, сохраненным в кэше. Чтобы заставить браузер загружать каждый раз обновленный файл, добавьте к имени файла «?» и уникальный номер (в примере используется дата и время):

Листинг 4. Обновление в Web 2.0
<html>
<head><title>javascript refresher</title>
</head>
<script language="JavaScript">

function refreshMe() {
   var random = Math.floor(Math.random()*10000);
   if (document.images) {
       var srcString = 'rpms.jpg' + random;
       //Добавляем псевдо-случайное число к URL графического файла
       document.images.thegraph.src = srcString;
   }
   //По истечении тайм-аута в миллисекундах снова вызываем этот метод
   setTimeout('refreshMe()',1000);
}

setTimeout('refreshMe()',1000);
</script>


<body>
<h1>Cyclist Revolutions Per Minute, Real Time Display</h1>
Click the refresh button if the graph does not appear below.
<hr>
<img src = "rpms.jpg" name = "thegraph">
<hr>

Помимо кода для обновления изображения вам понадобится способ вызывать эту функцию каждые несколько секунд. Для этого в конце метода добавлен setTimeout(), который, в свою очередь, инструктирует метод вызвать самого себя через 1 секунду. В результате код работает в бесконечном цикле, обеспечивая регулярное обновление графика и предоставляя вам возможность наблюдать за данными велотренажера в режиме реального времени.


Производительность системы

Компьютеры и велосипеды часто вызывают один и тот же вопрос: «Насколько он быстр?» Скорость работы системы определяется скоростью работы ее самого медленного компонента. Для оценки производительности Java-клиента используется максимальное время обработки. Для оценки производительности сервера отчетов можно воспользоваться пакетом Jmeter, предназначенным для нагрузочного тестирования Web-приложений и серверов.

Производительность клиента

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

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

В приведенном примере наибольшее время обработки равно 193 миллисекундам. Несложные подсчеты дают нам производительность работы приложения – около 310 новых точек в минуту для одного клиента. Необходимо заметить, что благодаря отказоустойчивости базы данных Informix, она может работать параллельно с несколькими клиентскими приложениями.

Листинг 5. Определение производительности клиента
193ms per insert
1/.193 = 5.18 inserts per second
60*1/.193 = 310.9 inserts per min

Использование Jmeter для нагрузочного тестирования

Для тестирования сервера WebSphere Application Server Community мы использовали тестовый пакет Jmeter. Это гибкий тестовый клиент, который способен создавать несколько потоков задач и измерять целый спектр характеристик. Более подробную информацию о пакете Jmeter можно найти в разделе Ресурсы.

Поскольку Jmeter не является клиентом JavaScript, мы включили в проект WebSphere статическую html-страницу для тестирования скорости ее обновления средствами Jmeter. Jmeter инициирует полную перезагрузку страницы используя HTML запрос GET для http://localhost:8080/BikeRPM/BikeRPM.html. Он также вызывает обновление фрагмента с графиком средствами Javascript, выполняя запрос get только для URL-адреса .jpg-файла, в нашем случае это http://localhost:8080/BikeRPM/rpms.jpg.

Чтобы убедиться в эффективности обновления графика средствами JavaScript, страница BikeRPM.html использует в качестве фонового изображения файл размером 1.5 MB. Вы можете возразить, что это излишне, а мы можем с вами поспорить, однако результаты тестирования просто ошеломляют:

Листинг 6. Результаты тестирования с помощью Jmeter
10 users, 100 page requests

Full page refresh: 		 3,824 requests/minute
Javascript image refresh:	23,210 requests/minute

Тестирование производительности показало, что частичное обновление страницы работает гораздо быстрее, чем полная перезагрузка. Кроме того, из результатов теста следует, что ограничение размера объекта на Web-странице может значительно повлиять на производительность.

Рисунок 13. График производительности в Jmeter, полное обновление страницы.
Рисунок 13. График производительности в Jmeter, полное обновление страницы.

Заключение и следующие шаги

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

  • Архитектура: Рассмотрите возможность нескольких источников сигнала. Как насчет гонок на велотренажерах?
  • Аналого-цифровое преобразование: Попробуйте собрать спектр аналоговых сигналов, используя более сложные технологии аналого-цифрового преобразования.
  • Java-клиент для сбора данных: Имеет смысл улучшить программный способ устранения «дребезга» переключателя.
  • Генерация отчетов JSP/Ajax/Web2.0: Добавьте возможности фильтрации данных и генерации итоговых отчетов, попробуйте разобраться в деталях.
  • Производительность системы: Всегда есть возможность повысить скорость работы системы. Оптимизируйте код и привлеките к участию в эксперименте хорошо подготовленных спортсменов.

Загрузка

ОписаниеИмяРазмер
Код, используемый в данной статьеcodesample.zip10KB

Ресурсы

Научиться

Получить продукты и технологии

  • Скачайте WebSphere Application Server Community Edition (EN), чтобы повторить все шаги, описанные в статье.
  • Загрузите пробную версию Informix Dynamic Server (EN).
  • Теперь DB2 доступна для свободного скачивания. Загрузите DB2 Express-C (EN), бесплатную версию DB2 Express Edition, поддерживающую все основные функции работы с данными и предоставляющую готовую базу для построения и запуска приложений.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management, WebSphere, Технология Java
ArticleID=363121
ArticleTitle=Сбор данных в режиме реального времени: Как подключить свой велотренажер к базе данных Informix или DB2
publish-date=01142009