IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  Технология Java | SOA и Web-сервисы | XML  >

Muse и WEF упрощают обработку событий

Реализация событий формата WSDM от Apache Muse позволяет обрабатывать события с помощью простого API.

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: средний

Ден Джемиоло, программист-консультант, IBM

06.12.2007

Формат событий для распределенного управления Web-сервисами (Web Service Distributed Management (WSDM) Event Format (WEF)) – это стандарт группы OASIS, описывающий как преобразовывать события, связанные с управлением системой, в XML. Этот стандарт подробно определяет требуемые и необязательные значения и их семантику, но он не предлагает рекомендаций по фактической реализации системы. К счастью в проекте Apache Muse есть реализация WEF, позволяющая создавать, отправлять и получать события WEF с помощью простого Java™ API. В данной статье показывается, как решаются подобные задачи в приложении, использующем Apache Muse.

Формат событий для распределенного управления Web-сервисами (Web Service Distributed Management (WSDM) Event Format (WEF)) – это отличное руководство, описывающее семантику обязательных и опциональных значений, необходимых для сериализации событий, связанных с управлением системой. Но какая от этого выгода пользователю, если этот стандарт не предлагает инструкций по реализации системы? Вам повезло, так как реализация WEF от Apache Muse предлагает простой Java API, позволяющий создавать, отправлять и получать WEF-события. Я покажу вам, как решать подобные задачи в приложении, использующем Apache Muse.

Прежде чем мы начнем, необходимо познакомиться с разработкой конечных точек вызова Web-сервисов (web service endpoint) c помощью Apache Muse, а также понять основные принципы, лежащие в основе WSDM и WEF. Ссылки на дополнительные материалы о WSDM и Muse можно найти в разделе Ресурсы.

Ссылки на полезные материалы
Эти документы могут оказаться полезными во время выполнения упражнений из этой статьи:

Создание событий WEF

Каркас Muse содержит API, похожий на JavaBeans, для создания и манипулирования событиями WEF. Если посмотреть JavaDoc для WEF API (см. Ресурсы), можно увидеть, что почти все поля WEF представлены в виде компонентов JavaBeans с методами get()ter и set()ter для каждого подполя. WEF-фабрика (см. ссылку в разделе Ресурсы) – это только часть API, более сложная, чем набор методов get()ter и set()ter, так как она предоставляет набор методов create(), позволяющих задавать значение частям события без создания зависимостей от конкретных классов реализации.

Чтобы продемонстрировать, как создаются WEF-события, создадим пустое событие и затем добавим к нему функциональность, пока не получится полностью документированное стандартное событие из области ИТ -запуск сервера. Начнем с создания простой Java-программы с методом main(), которая будет использоваться для создания и распечатки события. Кода из листинга 1 будет вполне достаточно.


Листинг 1. Создание простой Java-программы
import org.apache.muse.ws.dm.muws.events.*;
import org.apache.muse.ws.dm.muws.events.impl.SimpleWefFactory;

public class Test
{
    public static void main(String[] args)
    {
    	System.out.println();
    }
}

Перед компиляцией и запуском кода убедитесь, что переменная CLASSPATH указывает путь к следующим JAR-файлам:

  • muse-wsdm-wef-api.jar
  • muse-wsdm-wef-impl.jar
  • muse-util-xml.jar

После того как вы подготовили тестовое приложение, можно начинать добавлять код.

Настройка обязательных полей

Первый шаг по созданию события - это инициализация WEF-фабрики, это будет единственная ссылка на лежащую в основе реализацию WEF. Тот факт, что создание всех объектов выполняется через фабрику, позволяет заменить классы реализации WEF от Muse на свои собственные, не внося изменения в код. В данном случае мы хотим использовать реализацию от Muse, так что нам нужен класс org.apache.muse.ws.dm.muws.events.impl.SimpleWefFactory.

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


Листинг 2. Создание пустого события с помощью объекта фабрики
import org.apache.muse.ws.dm.muws.events.*;
import org.apache.muse.ws.dm.muws.events.impl.SimpleWefFactory;

public class Test
{
    public static void main(String[] args)
    {
        WefFactory factory = new SimpleWefFactory();
        
        ManagementEvent event = factory.createEvent();
        
    	System.out.println(event);
    }
}

Можно подумать, что после создания пустого события и вывода его на консоль, программа выведет на экран что-то вроде элемента <ManagementEvent/>, но вместо этого мы получим следующую ошибку.

java.lang.RuntimeException: [ID = "NoSourceComponent"] The WEF 
event has no source component. The source component field is required by 
the WEF schema.

Не паникуйте, на самом деле - это хороший знак. Реализация WEF от Muse проверяет, чтобы все события, которые она преобразует в последовательность байт или анализирует, соответствовали стандарту WSDM. Она не позволит преобразовать событие в XML, так как в нем отсутствует обязательное поле, на самом деле пропущено несколько требуемых полей, но Muse остановится после первой же ошибки. Теперь мы будем по одному добавлять требуемые поля, пока мы не получим необходимый минимум для запуска программы и распечатки события.

В листинге 3 показано, как добавить в событие компонент-источник (source component). Компонент-источник определяет адрес ресурса, сгенерировавшего событие, компонент-обозреватель (reporter component) задает адрес ресурса, опубликовавшего событие. Очень часто источник и обозреватель - это один и тот же ресурс. Так как все стандарты OASIS Web-служб используют технологию WS-Address для указания ресурсов, необходимо вставить ссылку на конечную точку вызова Web-сервиса (endpoint reference - EPR) в компонент-источник:


Листинг 3. Добавляем компонент-источник к событию
                
//
// create the source component wrapper
//
Component source = factory.createComponent();

source.setName(WefConstants.SOURCE_COMP_QNAME);
source.setResourceID("1234-56-7890");

//
// create the EPR that will go in the wrapper
//
URI sourceURI = URI.create("http://localhost/my-resources/services/event-publisher");
EndpointReference sourceEPR = new EndpointReference(sourceURI);
Element eprXML = sourceEPR.toXML();

//
// add the EPR to the source wrapper
//
ComponentAddress sourceAddress = factory.createComponentAddress();
sourceAddress.addExtendedElement(eprXML);
source.setAddress(sourceAddress);

//
// add the source info to the event
//
event.setSource(source);

Если собрать и запустить тестовое приложение после добавления кода из листинга 3, то мы получим отлично отформатированное WEF-событие.


Листинг. Отформатированное WEF событие
                
<muws1:ManagementEvent 
    xmlns:muws1="http://docs.oasis-open.org/wsdm/muws1-2.xsd" 
    ReportTime="2007-03-07T15:15:58-05:00">
    <muws1:EventId>uuid:182bef3c-b098-c4f8-1105-a3c25bc30fe6</muws1:EventId>
    <muws1:SourceComponent>
        <muws1:ComponentAddress>
            <wsa:EndpointReference 
                xmlns:wsa="http://www.w3.org/2005/08/addressing">
                <wsa:Address>
                    http://localhost/my-resources/services/event-publisher
                </wsa:Address>
            </wsa:EndpointReference>
        </muws1:ComponentAddress>
        <muws1:ResourceId>1234-56-7890</muws1:ResourceId>
    </muws1:SourceComponent>
</muws1:ManagementEvent>

Можно заметить, что программа работает, хотя к событию было добавлено только одно поле, хотя я говорил раньше: "их должно быть несколько". Если внимательно присмотреться к получившемуся XML-документу, то видно, что Muse добавил остальные необходимые поля: EventId и ReportTime, используя подходящие значения по умолчанию: текущее время и случайное значение для UUID соответственно. Эти значения можно изменить с помощью методов ManagementEvent.setEventId() и Management.setReportTime(), но для большинства пользователей будет достаточно значений по умолчанию.

Прежде чем продолжать, можно поэкспериментировать с методом ManagementEvent.setReporter() - он похож на метод setSource(), но предоставленный ERP трансформируется в элемент <muws1:ReporterComponent/> вместо элемента <muws1:SourceComponent/>.

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

Установка полей, описывающих состояние

В WEF-поле Situation хранятся наиболее интересные данные о событии. Это поле хранит тип события, сообщение и другую полезную информацию, необходимую программам и людям, обрабатывающим событие. И снова Muse приходит на помощь, давая уверенность в том, что вы создадите корректный элемент <muws2:Situation/> до того как попытаетесь преобразовать его в формат XML.

Код из листинга 5 использует предопределенные WSDM-значения, чтобы описать категорию состояния и также предоставляет сообщение, которое может оказаться полезным администраторам, которые будут просматривать событие в системном журнале.


Листинг 5. Необходимо построить корректный элемент <muws2:Situation/>
                
//
// add a situation that describes a server starting
//
Situation situation = factory.createSituation();
situation.setCategoryType(WefConstants.START_SITUATION_QNAME);
situation.setPriority(Situation.LOW_PRIORITY);
situation.setSeverity(Situation.INFO_SEVERITY);
situation.setSuccessDisposition(Situation.SUCCESSFUL);
situation.setMessage("The application 'server1' started successfully.");

event.setSituation(situation);

Добавив новый код, запустите тестовую программу, и вы получите следующий XML для события. Фрагмент, относящийся к состоянию, выделен жирным шрифтом:


Листинг 6. Событие в формате XML, информация о состоянии выделена жирным шрифтом
                
<muws1:ManagementEvent
    xmlns:muws1="http://docs.oasis-open.org/wsdm/muws1-2.xsd" 
    ReportTime="2007-03-07T15:43:48-05:00">
    <muws1:EventId>uuid:25e00dbd-ec20-64b1-e53f-59569c1780d9</muws1:EventId>
    <muws1:SourceComponent>
        <muws1:ComponentAddress>
            <wsa:EndpointReference 
                xmlns:wsa="http://www.w3.org/2005/08/addressing">
                <wsa:Address>
                    http://localhost/my-resources/services/event-publisher
                </wsa:Address>
            </wsa:EndpointReference>
        </muws1:ComponentAddress>
        <muws1:ResourceId>1234-56-7890</muws1:ResourceId>
    </muws1:SourceComponent>
    <muws2:Situation 
        xmlns:muws2="http://docs.oasis-open.org/wsdm/muws2-2.xsd">
        <muws2:SituationCategory>
            <muws2:StartSituation/>
        </muws2:SituationCategory>
        <muws2:SuccessDisposition>Successful</muws2:SuccessDisposition>
        <muws2:SituationTime>2007-03-07T15:43:48-05:00</muws2:SituationTime>
        <muws2:Priority>10</muws2:Priority>
        <muws2:Severity>1</muws2:Severity>
        <muws2:Message>
            The application server 'server1' started successfully.
        </muws2:Message>
    </muws2:Situation>
</muws1:ManagementEvent>

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

Публикация WEF-событий

Код, который был написан ранее, можно использовать для создания события в любом месте приложения, основанного на Muse. Обычно требуется сгенерировать объект события в ответ на реальное событие, произошедшее в вашей системе. Функциональность, созданная в классах, использующих Muse, может быть дополнена функциональностью для создания объектов событий и их публикации с помощью технологии WS-Notification (WSN). Чтобы опубликовать событие с помощью WSN из вашего кода, просто добавьте следующие строки:

ManagementEvent event = ...     // as before

NotificationProducer wsn = getResource().getCapability(WsnConstants.PRODUCER_URI);
wsn.publish(WefConstants.START_SITUATION_QNAME, event);

После вызова метода NotificationProducer.publish(), реализация WSN от Muse берет на себя задачу по трансформации события в XML, упаковке его в уведомляющее сообщение WSN, и отправке его получателям, которые заинтересованы в этом событии. Если вы хотите быстро проверить эту возможность без создания собственной конечной точки WSDM, попробуйте изменить проект-пример wsn-producer, поставляемый вместе с Muse, чтобы он публиковал событие WEF. Вы увидите опубликованные события в журнале событий сервера.

Получение и анализ WEF-событий.

С точки зрения получателя анализировать событие в формате XML даже проще, чем создавать объект события с нуля. Если у вас есть ресурс, реализующий функциональность WSN NotificationConsumer, то можно добавить приемник сообщений, который будет обрабатывать входящие оповещения и анализировать их содержание с помощью WEF API. В листинге 7 приведен код приемника, извлекающего событие WEF из оповещения и выводящего его в консоль.


Листинг 7. Приемник сообщений, извлекающий событие WEF из оповещения и выводящий его в консоль
                
import org.apache.muse.ws.dm.muws.events.*;
import org.apache.muse.ws.dm.muws.events.impl.SimpleWefFactory;
import org.apache.muse.ws.notification.NotificationMessageListener;

public class MyListener implements NotificationMessageListener
{
    public boolean accepts(NotificationMessage message)
    {
        return true;
    }
    
    public void process(NotificationMessage message)
    {
        WefFactory factory = new SimpleWefFactory();
        
        Iterator i = message.getMessageContentNames().iterator();
        
        while (i.hasNext())
        {
            QName payloadName = (QName)i.next();
            Element payload = message.getMessageContent(payloadName);
            
            ManagementEvent event = factory.createEvent(payload);
            
            System.out.println(event);
        }
    }
}

Как можно увидеть, те же самые методы create() фабрики, которые позволили создать события с нуля, могут использоваться для разбияния XML на объекты. Теперь можно использовать get()ter методы объекта события для получения доступа к детальной информации о событии и обеспечения соответствующей реакции. Точно так же как и в предыдущем разделе, этот код можно быстро проверить, изменив один из примеров Muse - проект wsn-consumer. Этот пример не очень большой, так что будет легко поменять существующий приемник сообщений на приемник из листинга 7.

Заключение

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



Ресурсы

Научиться
  • Оригинал статьи (EN).

  • Изучите спецификацию WEF, которая содержится в 1-й и 2-й частях документа WSDM MUWS.(EN)

  • Эти документы могут оказаться полезными при работе со статьей:(EN)
    • JavaDoc для WEF API.
    • WEF-фабрика определяет методы, необходимые для инициализации "пустых" событий WEF и их подкомпонентов, также как и существующих событий и их подкомпонентов из XML-фрагментов.
    • Функциональность WSN NotificationConsumer обеспечивает операцию WS-N Notify и предоставляет простой API для приемника сообщений для использования в других серверных компонентах.

  • Web-сайт Apache Muse предоставляет все стандарты OASIS, поддерживаемые этим проектом.(EN)

  • Следующие учебные материалы обеспечат более глубокое понимание Muse и WSDM.(EN)
  • В разделе Autonomic computing на developerWorks можно найти ссылки на такие ресурсы как статьи, учебные материалы, стандарты и спецификации и инструменты для загрузки, такие как Build to Manage Toolkit for Problem Determination.(EN)

  • В разделе SOA и Web-сервисы на developerWorks представлены дополнительные материалы по стандартам WS и расказано об их влиянии на технологии.

  • В разделе Технология Java на developerWorks представлены дополнительные материалы по различным Java API.

  • В разделе XML на developerWorks можно найти материалы по XML.


Получить продукты и технологии
  • Скачайте Apache Muse 2.1.0, чтобы собрать и проверить код, приведенный в этой статье.(EN)


Обсудить


Об авторе

Ден Джемиоло (Dan Jemiolo) работает программистом-консультантом в команде IBM Autonomic Computing в Research Triangle Park, NC. Он возглавлял проектирование и разработку Apache Muse 2.0 и продолжает работать над проектом. Ден также участвовал в WS-RF TC как редактор спецификации по WS-ResourceMetadataDescriptor и в стратегии IBM по расширению применения стандартов Web-сервисов. Он пришел в IBM два года назад, после того как получил степень магистра вычислительных наук в Rensselaer Polytechnic Institute.




Выскажите мнение об этой странице


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



ДаНетНе знаю
 


 


12345
 


В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.

    IBM в России Конфиденциальность Контакты