- •Структурно-функціональна організація апаратного та програмного забезпечення обчислювачів.
- •1.4 Структура аом
- •1.5 Структура гом
- •Системи машинних команд процесорів, формати даних і способи кодування команд і даних.
- •Способи організації доступу до даних та методи адресування команд і даних.
- •1.4 Організація підсистеми пам’яті комп’ютера.
- •1.5 Способи організації взаємодії апаратного забезпечення із системним програмним забезпеченням.
- •1.6 Взаємодія комп’ютера із зовнішніми пристроями.
- •Елементна база комп’ютерів.
- •2.2 Архітектура мп 80486, Pentium, мп adsp.
- •Базовая архитектура процессоров adsp-21xx
- •2.3 Архітектура процесора 80с51.
- •2.4 Risc-процесори ті їх архітектура.
- •2.5 Адресний простір. Способи адресації операндів.
- •2.6 Оперативна пам’ять: архітектура та принципи управління.
- •2.7 Система переривань та їх характеристики.
- •2.8 Динамічний розподіл пам’яті. Організація віртуальної пам’яті.
- •3.1 Склад системного програмного забезпечення.
- •3.2 Класифікація операційних систем.
- •Особенности алгоритмов управления ресурсами
- •Особенности аппаратных платформ
- •Особенности областей использования
- •Особенности методов построения
- •3.3 Різновиди мультизадачності в операційних системах.
- •3.4 Процеси та потоки в операційних системах.
- •Реальний та захищений режими адресації.
- •Особенности процессора 80286
- •Особенности процессоров 80386 — 80486
- •Страничная организация памяти
- •Описание
- •Использование
- •Структура адресного пространства ibm pc в реальном режиме Основная область памяти
- •Дополнительная область памяти
- •3.6 Оперативна пам’ять в мультизадачному режимі.
- •Алгоритми заміщення сегментів та сторінок у віртуальній пам’яті.
- •Структура жорсткого диску.
- •Vfat и длинные имена файлов
- •Файлова система hpfs.
- •Файлова система ntfs.
- •Керування процесами у операційних системах, їх стани та переходи. Управление процессами
- •Состояние процессов
- •Контекст и дескриптор процесса
- •Алгоритмы планирования процессов
- •Вытесняющие и невытесняющие алгоритмы планирования
- •3.11 Основні режими введення-виведення.
- •3.12 Оптимізація роботи з жорстким диском.
- •4.1 Структура системних областей пам’яті (ms-dos).
- •4.2 Програмування дискової підсистеми комп’ютера (mbr, Partition Table, fat12/16/32).
- •4.3 Програмування відеосистеми комп’ютера (cga, ega, vga).
- •4.4 Особливості програмування текстового та графічного режимів відеоадаптера.
- •4.5 Робота з маніпулятором миші (ms-dos, ms-Windows).
- •4.6 Обробка переривань.
- •4.1. Таблица векторов прерываний
- •4.2. Маскирование прерываний
- •4.4. Особенности обработки аппаратных прерываний
- •4.8 Ініціалізація dll-бібліотек, динамічний експорт та імпорт функцій у середовищі Microsoft Windows. Бібліотеки динамічної компоновки. Ініціалізація dll.
- •2.23.1. Статическая и динамическая компоновка
- •Експорт та імпорт функцій при використанні dll-бібліотек.
- •5.1 Системні та локальні шини, основні характеристики.
- •5.2 Шини з комутацією ланцюгів та комутацією пакетів. Розщеплення транзакцій.
- •5.3 Шини Firewire (ieee 1394), pci, pci-e, основні характеристики.
- •Особенности ieee - 1394
- •Шини pci основні характеристики.
- •ШиниPci-е, основні характеристики.
- •5.4 Стандарт ieee 1284 – 1994, фізичний та електричний інтерфейси.
- •5.6 Характеристики сучасних жорстких дисків.
- •5.7 Інтерфейси жорстких дисків в ibm pc, їх особливості.
- •5.8 Характеристики сучасних принтерів, сканерів.
- •5.9 Структура та принцип роботи сучасних модемів.
- •5.10 Основні характеристики джерел безперервного живлення.
- •6.1 Архітектура і стандартизація комп’ютерних мереж.
- •6.2 Лінії зв’язку: класифікація, характеристики, типи кабелів.
- •6.3 Методи кодування даних у комп’ютерних мережах.
- •6.4 Технології канального рівня tcp/ip та їх специфікації. Стек протоколов tcp/ip История и перспективы стека tcp/ip
- •Структура стека tcp/ip. Краткая характеристика протоколов
- •6.5 Мережеве обладнання: класифікація, функції.
- •Параметры сетевого адаптера
- •Функции и характеристики сетевых адаптеров
- •Классификация сетевых адаптеров
- •6.6 Протоколи локальних мереж: tcp, udp, iPv4, iPv6 та ін.
- •36. Протоколи транспортного рівня tcp и udp (загальна характеристика, порти)
- •37. Протокол транспортного рівня udp
- •Адресация iPv4
- •Синтаксис адреса iPv4
- •Типы адресов iPv4
- •Индивидуальные адреса iPv4
- •Групповые адреса iPv4
- •Широковещательные адреса iPv4
- •История создания
- •Исчерпание iPv4 адресов в 2011 году
- •Тестирование протокола
- •Внедрение протокола
- •Сравнение с iPv4
- •Автоконфигурация
- •Метки потоков
- •Механизмы безопасности
- •Основы адресации iPv6
- •Типы Unicast адресов
- •Формат пакета
- •Нотация
- •Зарезервированные адреса iPv6
- •6.7 Адресація в комп’ютерних мережах.
- •Ip адресация, классы ip адресов и значение маски подсети
- •Для чего нужны ip адреса?
- •Структура ip адреса
- •Разделение ip адреса на сетевую и узловую части
- •Классы ip адресов и маски подсети по умолчанию
- •Классовая и бесклассовая адресация
- •Назначение маски подсети
- •Публичные и частные ip-адреса
- •Адреса одноадресных, широковещательных и многоадресных рассылок
- •Одноадресная рассылка
- •Широковещательная рассылка
- •Многоадресная рассылка
- •Сравнение протоколов ip версии 4 (iPv4) и ip версии 6 (iPv6)
- •6.8 Об’єктивні характеристики комп’ютерних мереж.
- •6.9 Схема ip-маршрутизації.
- •6.10 Фрагментація ip-пакетів. Фрагментация ip-пакетов
- •6.11 Служби dns та dhcp.
- •Ключевые характеристики dns
- •Дополнительные возможности
- •Терминология и принципы работы
- •Рекурсия
- •Обратный dns-запрос
- •Записи dns
- •6.12 Протоколи маршрутизації. Протоколы маршрутизации
- •Віртуальні приватні мережі.
- •Уровни реализации
- •Структура vpn
- •Классификация vpn
- •По степени защищенности используемой среды
- •По способу реализации
- •По назначению
- •По типу протокола
- •По уровню сетевого протокола
- •6.14 Засоби забезпечення надійності функціонування та захисту комп’ютерних мереж.
- •7.1 Основи мови програмування Java.
- •7.2 Проміжне програмне забезпечення розподілених комп’ютерних систем. Архітектура rpc (Remote Procedure Calls).
- •7.3 Технологія rmi (Remote Method Invocation).
- •24. Java rmi Достоинства и недостатки Java rmi
- •7.4 Технологія corba .
- •7.5 Сервлет-технологія Java.
- •7.6 Сторінки jsp. Теги та вбудовані об’єкти jsp.
- •26. Теги и встроенные объекты jsp:
- •7.7 Технологія jms. Моделі jms-повідомлень.
- •Введение
- •Архитектура jms
- •Первое знакомство
- •Модель сообщений jms
- •Поля заголовка
- •Свойства (properties) сообщений
- •Уведомления сообщений
- •Интерфейс Message
- •Выборка сообщений
- •Доступ к отправленным сообщениям
- •Изменение полученного сообщения
- •Тело сообщения
- •7.8 Основи мови xml.
- •7.9 Протокол soap. Структура soap – документа.
- •1.4. Операторы
- •1.4.1. Оператор выражение
- •1.4.2. Пустой оператор
- •1.4.3. Составной оператор
- •1.4.4. Оператор if
- •1.4.5. Оператор switch
- •1.4.6. Оператор break
- •1.4.7. Оператор for
- •1.4.8. Оператор while
- •1.4.9. Оператор do while
- •1.4.10. Оператор continue
- •1.4.11. Оператор return
- •1.4.12. Оператор goto
- •8.2 Одновимірні та багатовимірні масиви. Покажчики. Масиви динамічної пам’яті.
- •8.3 Структури, об’єднання, бітові поля структур та об’єднань.
- •Объявление битовых полей
- •Доступ к элементам структур с битовыми полями
- •Размещение битовых полей в памяти
- •Призначення функції. Опис, визначення, виклик функції. Передача даних за значенням та за покажчиком.
- •Функції з параметрами, що замовчуються, зі зміними параметрами
- •8.5 Перевантаження функцій. Шаблони функцій. Покажчики на функції. Перевантажені функції, шаблони функцій.
- •8.6 Функції роботи з файлами. Введення/виведення даних різного типу у файл/з файлу.
- •Int fprintf(file *fp, char *format [,аргумент]…);
- •Int fscanf(file *fp, char *format [,указатель]…);
- •Визначення класу. Конструктор, перевантажені конструктори, деструктор.
- •8.8 Статичні члени класу. Дружні функції класу. Перевантаження операцій.
- •18 Ооп. Поняття дружніх функціїй. Різниця між дружньою функцією - членом класу та не членом класу.
- •19 Ооп. Поняття перевантаження операцій. Правила її використання.
- •8.9 Успадкування класів. Множинне успадкування.
- •9.1 Векторні, паралельні, конвеєрні системи.
- •9.2 Основні характеристики паралельних алгоритмів: ступінь паралелізму, прискорення, ефективність. Закон Амдала.
- •Математическое выражение
- •Иллюстрация
- •Идейное значение
- •9.3 Метод логарифмічного здвоєння та рекурсивного подвоєння.
- •9.4 Методи паралельного множення матриць. §34. Алгоритм умножения матриц
- •9.5 Стандарт mpi, основні функції для організації паралельних програм: ініціалізації та завершення паралельної програми, визначення рангу процесу, визначення загального числа процесів.
- •9.6 Функції двохточкового обміну.
- •9.7 Функції колективного обміну: розподілення, широкомовної розсилки, збору, зведення, сканування.
- •10.1 Архітектура субд. Функції субд.
- •2.1. Основные функции субд
- •2.1.1. Непосредственное управление данными во внешней памяти
- •2.1.2. Управление буферами оперативной памяти
- •2.1.3. Управление транзакциями
- •2.1.4. Журнализация
- •2.1.5. Поддержка языков бд
- •10.2 Реляційна модель та її характеристики.
- •10.3 Потенційні, первинні та зовнішні ключі.
- •10.4 Цілісність реляційних даних. Целостность реляционных данных
- •10.5 Операції реляційної алгебри.
- •10.6 Основні поняття sql: прості запити, склеювання таблиць; умови відбору рядків таблиць; агрегатні функції, запити з групуванням, складні запити. Sql. Простые запросы
- •Агрегатные функции, группировка данных
- •Запрос с группировкой
- •Пояснения
- •Сложные запросы
- •Объединение таблиц
- •Имена таблиц и столбцов
- •Создание обьединения
- •Объединение таблиц через справочную целостность
- •Объединения таблиц по равенству значений в столбцах и другие виды объединений
- •Объединение более двух таблиц
- •Объединение таблицы с собой псевдонимы
- •10.7 Інфологічна, логічна або концептуальна модель даних. Основные этапы проектирования баз данных Концептуальное (инфологическое) проектирование
- •Логическое (даталогическое) проектирование
- •Физическое проектирование
- •10.8 Функціональні залежності. 1, 2 та 3 нормальні форми відношень.
- •8 Нормалізація відношень. 1 та 2 нормальні форми.
- •9 Нормалізація відношень. 3 нормальна форма та нормальна форма Бойса-Кодда. Навести приклади
- •Нормальные формы er-диаграмм
- •Первая нормальная форма er-диаграммы
- •Вторая нормальная форма er-диаграммы
- •Третья нормальная форма er-диаграммы
- •Семантическая модель Entity-Relationship (Сущность-Связь)
- •Основные понятия er-модели
- •Уникальные идентификаторы типов сущности
- •Нормальные формы er-диаграмм
- •Первая нормальная форма er-диаграммы
- •Вторая нормальная форма er-диаграммы
- •Третья нормальная форма er-диаграммы
- •10.9 Багатозначні залежності та залежності з’єднання. 4 та 5 нормальні форми відношень.
- •9.3. Зависимости проекции/соединения и пятая нормальная форма
- •9.3.2. Зависимость проекции/соединения
- •9.3.3. Аномалии, вызываемые наличием зависимости проекции/соединения
- •9.3.4. Устранение аномалий обновления в 3-декомпозиции
- •2.5.5. Пятая нормальная форма
- •4.5. Нормальные формы
- •10.10 Проектування бд методом сутність-зв’язок. Er-діаграми. Моделирование методом "сущность-связь" Основные понятия модели "сущность-связь"
- •Графическая нотация модели: диаграммы "сущность-связь"
- •Нормализация модели "сущность-связь"
- •11.1 Властивості інформації. Класифікація загроз інформації.
- •11.2 Рівні захисту інформації в комп’ютерних мережах.
- •11.3 Законодавчий рівень захисту інформації.
- •11.4 Криптографічний захист інформації.
- •11.5 Стандарти симетричного шифрування даних.
- •11.6 Системи ідентифікації та аутентифікації користувачів.
- •11.7 Парольна система. Вимоги до паролів.
- •11.8 Методи та засоби захисту від віддалених мережевих атак.
Первое знакомство
Использование JMS предполагает выполнение разработчиком последовательности шагов. Ниже приведена общая схема применения JMS API.
Любой компонент, использующий JMS, прежде всего должен создать соединение с JMS -провайдером - собственно системой, обеспечивающей всю функциональности управления сообщениями.
Рис. 13.4. Общая схема использования JMS API
Для этого используется специальная фабрика объектов - ConnectionFactory. ConnectionFactory на самом деле является интерфейсом, от которого наследуютQueueConnectionFactory, TopicConnectionFactory, XAQueueConnectionFactory и XATopicConnectionFactory.Таким образом, мы будем иметь дело с реализацией одного из этих интерфейсов. Для того чтобы получить доступ к ConnectionFactory,программа должна извлечь соответствующую ссылку из JNDI. С использованием механизма аннотаций соответствующий код будет иметь следующий вид:
@>Resource(mappedName="jms/ConnectionFactory")
private static ConnectionFactory connectionFactory;
Указанный фрагмент кода извлекает ресурс с JNDI -именем jms/ConnectionFactory и связывает его с переменной connectionFactory.
Естественно, перед первым применением ConnectionFactory должна быть создана командой
asadmin.bat create-jms-resource --user admin --passwordfile
admin-password.txt --host localhost --port 4848 --restype
javax.jms.ConnectionFactory --enabled=true jms/ConnectionFactory
Данная команда создает ресурс типа javax.jms.ConnectionFactory с именем jms/ConnectionFactory .
Следующим шагом является создание соединения с JMS провайдером. Соответствующий код будет выглядеть следующим образом:
Connection connection = connectionFactory.createConnection();
Следует отметить, что соединение должно быть закрыто после того, как оно перестает использоваться (connection.close()).
После того как соединение создано, могут быть созданы виртуальные каналы, в рамках которых будет осуществляться передача сообщений. Существуют два типа таких каналов - очередь ( Queue ) и тема ( Topic ). Следует отметить, что создание виртуального канала требует наличия соответствующего "пункта назначения" (destination ), созданного в JNDI. Таким образом, прежде чем программа сможет задействовать очередь (или тему), соответствующий объект должен быть создан в JMS -провайдере. Для Sun Application Server соответствующая команда будет иметь вид:
asadmin.bat create-jms-resource --user admin --passwordfile
admin-password.txt --host localhost --port 4848 --restype
javax.jms.Queue --enabled=true --property Name=PhysicalQueue jms/Queue
где restype указывает тип объекта - в данном случае это javax.jms.Queue,а параметр property задает JNDI имя объекта - jms/Queue.
Для того, чтобы в программе получить ссылку на соответствующий объект, можно использовать код вида
@>Resource(mappedName="jms/Queue") private static Queue queue;
для очереди, или, если нужно получить ссылку на объект типа тема:
@>Resource(mappedName="jms/Topic") private static Topic topic;
Еще раз обращаем внимание на то, что объекты с именами jms/Queue или jms/Topic должны быть предварительно созданы.
После того как соединение с JMS провайдером установлено и получены ссылки на соответствующие пункты назначения (очередь или тема), может начаться собственно процесс обмена сообщениями.
Весь процесс обмена происходит в рамках сессии ( Session ), которая представляет собой однопотоковый контекст для обмена сообщениями. Сессия также предоставляет транзакционный контекст для обеспечения атомарности выполнения групп передач/приемов сообщений1). Сессия может быть создана следующим образом:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
где первый параметр указывает на то, что секция не транзакционна, а второй параметр указывает на то, что необходимо автоматически подтверждать успешную доставку сообщений.
В рамках сессии приложение может создать ряд объектов, обеспечивающих отправку и приемку сообщений. Это Message Producers и Message Consumers.
Создаются эти объекты следующим образом:
MessageProducer producer = session.createProducer(queue);
MessageConsumer consumer = session.createConsumer(queue);
В качестве аргумента методы создания требуют указания пункта назначения. После создания посредством MessageProducer приложение может отправлять сообщения, а посредством MessageConsumer - принимать. Для отправки сообщения достаточно вызвать метод send, передав ему в качестве аргумента объект типа Message:
producer.send(message)
Для синхронного приема сообщения необходимо сначала запустить диспетчеризацию сообщения, затем вызвать метод receive соответствующегоMessageConsumer.Метод receive является блокирующим, однако он может быть вызван с указанием количества миллисекунд, в течение которых он должен ожидать чтения сообщения.
connection.start();
Message m = consumer.receive();
при этом управление вернется в момент прихода сообщения, или
connection.start();
Message m = consumer.receive(2000);
При этом управление вернется в момент прихода сообщения или по истечении 2 секунд.
Для асинхронного приема сообщения может быть создан специальный класс - листенер, который должен быть зарегистрирован в рамках данногоMessageConsumer и метод которого onMessage будет вызван в момент прихода сообщения.
Listener myListener = new Listener();
consumer.setMessageListener(myListener);
Типы сообщений
Сообщение в JMS - это объект Java, состоящий из двух частей: заголовка ( header ) и тела ( body ) сообщения. В заголовке находится служебная информация, тело сообщения содержит в себе пользовательские данные, которые могут быть разной формы: текстовой, сериализуемых объектов, байтовых потоков и т. д.
JMS API определяет несколько типов сообщений:
BytesMessage предназначен для передачи потока байт, который система никак не интерпретирует;
MapMessage предназначен для передачи множества элементов типа "имя-значение", где имена являются объектами строкового типа, а значения - объектами примитивных типов данных Java ;
ObjectMessage предназначен для передачи сериализуемых объектов;
StreamMessage предназначен для передачи множества элементов примитивных типов данных Java (они могут быть последовательно записаны, а затем прочитаны из тела сообщения этого типа);
TextMessage предназначен для передачи текстовой информации.
Первая программа
Приведем практический пример применения рассмотренных технологий и пройдем по шагам все этапы создания приложения с использованием JMS.
Во-первых, нам потребуется JMS -провайдер. В качестве такового будет использован встроенный сервис Sun Java System Application Server, поставляемый в составе пакета J2EE. Инсталляция этого сервера приложений была рассмотрена ранее.
Рис. 13.5. Административная консоль. Создание ConnectionFactory
Как уже говорилось ранее, первым шагом при разработке JMS приложения является создание необходимых ресурсов. Первый ресурс, который будет нами создан, -ConnectionFactory.В нашем случае это делается командой
asadmin.bat create-jms-resource -user admin --passwordfile
admin-password.txt --host localhost --port 4848 --restype
javax.jms.ConnectionFactory --enabled=true
jms/Exаmple1ConnectionFactory
Убедиться, что указанный ресурс создан, можно с помощью административной консоли2).
Следующим ресурсом, который необходимо создать, является "пункт назначения". Для нашего примера будет создан пункт назначения типа "очередь" с именемExample1Queue:
Рис. 13.6. Административная консоль. Создание пункта назначения
asadmin.bat create-jms-resource --user admin --passwordfile
admin-password.txt --host localhost --port 4848 --restype
javax.jms.Queue --enabled=true --property Name=PhysicalQueue
jms/Exаmple1Queue
Как и в случае с ConnectionFactory,созданный объект доступен в административной консоли.
Теперь, после того как все необходимые ресурсы созданы, можно приступить к созданию приложения. В качестве первого примера мы разработаем простое приложение, которое состоит из двух компонентов, обменивающихся текстовыми сообщениями в синхронном режиме.
JMSClient
Класс JMSClient после своего запуска создает соединение с JMS провайдером, создает сессию и MessageProducer,после чего в ответ на каждый ввод пользователя посылает в очередь текстовое сообщение. Работа завершается, если пользователь ввел символ q (или Q ).
1 import javax.jms.ConnectionFactory;
2 import javax.jms.Destination;
3 import javax.jms.Queue;
4 import javax.jms.Topic;
5 import javax.jms.Connection;
6 import javax.jms.Session;
7 import javax.jms.MessageProducer;
8 import javax.jms.TextMessage;
9 import javax.jms.JMSException;
10 import javax.annotation.Resource;
11 import java.io.InputStreamReader;
12 import java.io.IOException;
13 public class JMSClient {
14 @Resource(mappedName = "jms/Example1ConnectionFactory")
15 private static ConnectionFactory connectionFactory;
16 @Resource(mappedName = "jms/Example1Queue")
17 private static Queue queue;
18 public static void main(String[] args) {
19 Connection connection = null;
20 Destination dest = (Destination) queue;
21 try {
22 connection = connectionFactory.createConnection();
23 Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
24 MessageProducer producer = session.createProducer(dest);
25 TextMessage message = session.createTextMessage();
26 InputStreamReader inputStreamReader = new InputStreamReader(System.in);
27 char c = 'n';
28 int i = 0;
29 while (!((c == 'q') || (c == 'Q'))) {
30 try {
31 c = (char) inputStreamReader.read();
32 message.setText("This is message " + (i + 1));
33 System.out.println("Sending message: " + message.getText());
34 producer.send(message);
35 i++;
36 } catch (IOException e) {
37 System.err.println("I/O exception: " + e.toString());
38 }
39 }
40 } catch (JMSException e) {
41 System.err.println("Exception occurred: " + e.toString());
42 } finally {
43 if (connection != null) {
44 try {
45 connection.close();
46 } catch (JMSException e) {
47 }
48 }
49 }
50 }
51 }
Листинг 13.1. Класс JMSClient (html, txt)
Программа демонстрирует весь цикл создания типичного JMS приложения. Сначала (строки 14-17) определяются необходимые ресурсы - в данном случаеConnectionFactory и Queue (эти ресурсы с соответствующими именами были ранее созданы).
Затем создаются соединение с JMS -провайдером (строка 22) и сессия (строка 23). Следующим шагом является создание MessageProducer (строка 24) и текстового сообщения (строка 25).
Цикл работы программы (строки 29-39) состоит в ожидании ввода пользователя (строка 31), формировании тела сообщения (строка 32) и его отправки в очередь (строка 34). В конце работы программа закрывает соединение с JMS провайдером (строка 45).
JMSServer
Класс JMSServer служит для обработки сообщений, отправляемых JMSClient. Он синхронным образом считывает сообщения из очереди и печатает их.
1 import javax.jms.ConnectionFactory;
2 import javax.jms.Destination;
3 import javax.jms.Queue;
4
5 import javax.jms.Connection;
6 import javax.jms.Session;
7 import javax.jms.MessageConsumer;
8 import javax.jms.Message;
9 import javax.jms.TextMessage;
10 import javax.jms.JMSException;
11 import javax.annotation.Resource;
12 public class JMSServer {
13 @Resource(mappedName = "jms/Example1ConnectionFactory")
14 private static ConnectionFactory connectionFactory;
15 @Resource(mappedName = "jms/Example1Queue")
16 private static Queue queue;
17 public static void main(String[] args) {
18 String destType = null;
19 Connection connection = null;
20 Session session = null;
21 Destination dest = (Destination) queue;;
22 MessageConsumer consumer = null;
23 TextMessage message = null;
24 try {
25 connection = connectionFactory.createConnection();
26 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
27 consumer = session.createConsumer(dest);
28 connection.start();
29 while (true) {
30 Message m = consumer.receive(1);
31 if (m != null) {
32 if (m instanceof TextMessage) {
33 message = (TextMessage) m;
34 System.out.println(
35 "Reading message: " + message.getText());
36 }
37 }
38 }
39 } catch (JMSException e) {
40 System.err.println("Exception occurred: " + e.toString());
41 } finally {
42 if (connection != null) {
43 try {
44 connection.close();
45 } catch (JMSException e) {
46 }
47 }
48 }
49 }
50 }
Листинг 13.2. Класс JMSServer (html, txt)
Отличие от предыдущего класса заключается в том, что создается не MessageProducer,а MessageConsumer (строка 27), поскольку мы собираемся не отправлять сообщения, а принимать их. Для того чтобы начать обработку сообщений, необходимо вызвать метод start (строка 28).
Цикл работы программы (строки 29-38) состоит в ожидании прихода нового сообщения (строка 30). В данном случае ожидание продолжается 1 миллисекунду. Если пришедшее сообщение имеет текстовый тип (именно такие сообщения мы ожидаем получить), оно извлекается и печатается тело сообщения.
Компиляция и запуск
Компиляция приложений JMS не имеет особенностей, единственное, что нужно сделать, - указать соответствующие библиотеки в classpath:
javac -classpath . ;activation.jar;appserv-ws.jar;javaee.jar;
jsfimpl.jar;appserv-jstl.jar; -d build JMSClient.java
javac -classpath . ;activation.jar;appserv-ws.jar;javaee.jar;
jsfimpl.jar;appserv-jstl.jar; -d build JMSServer.java
Затем нужно собрать соответствующие пакеты ( jar ):
jar -cvfm server.jar manifest2.mf -C ./build .
jar -cvfm client.jar manifest.mf -C ./build .
При этом файлы манифеста имеют следующий вид: manifest.mf (пример. 13.3) и manifest2.mf (пример. 13.4).
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: asw
Main-Class: JMSClient
Листинг 13.3. Файл manifest.mf (html, txt)
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: asw
Main-Class: JMSServer
Листинг 13.4. Файл manifest2.mf (html, txt)
В результате будут созданы два пакета - server.jar и client.jar.Запуск приложения производится с помощью утилиты appclient, соответственно:
appclient -client client.jar
для клиента (отправителя сообщений) и
appclient -client server.jar
для сервера (обработчика сообщений).
После запуска клиент в ответ на ввод пользователя будет посылать сообщения в очередь, сервер будет их принимать и печатать.
Следует обратить внимание, что сервер и клиент не обязательно должны быть запущены одновременно. Так, клиент, будучи запущенным, может сгенерировать несколько сообщений и закончить работу. Сервер, будучи запущенным позднее, эти сообщения получит, поскольку JMS -провайдер их сохранил.
Ниже приведен пример работы системы.
appclient -client client.jar
Запуск клиента приведет к выводу сообщений об отправке.
Sending message: This is message 1
Sending message: This is message 2
Sending message: This is message 3
Sending message: This is message 4
Sending message: This is message 5
Sending message: This is message 6
Sending message: This is message 7
Sending message: This is message 8
Sending message: This is message 9
Sending message: This is message 10
Запуск сервера:
appclient -client server.jar
приведет к выводу сообщений о приеме.
Reading message: This is message 1
Reading message: This is message 2
Reading message: This is message 3
Reading message: This is message 4
Reading message: This is message 5
Reading message: This is message 6
Reading message: This is message 7
Reading message: This is message 8
Reading message: This is message 9
Reading message: This is message 10