 | Уровень сложности: средний Шайлеш К. Михра, инженер-программист, IBM
24.06.2009 Ищете пути повышения производительности ваших Web-сервисов? Попробуйте воспользоваться асинхронными bean-компонентами. В этой статье поясняется, как Web-сервисы осуществляют доступ к контенту, размещенному на различных ресурсах, для последовательного выполнения бизнес-операций и рассказывается, как асинхронные bean-компоненты могут в этом помочь.
Введение
Асинхронные bean-компоненты являются особенностью IBM® WebSphere® Application Server V6.0. В состав WebSphere Application Server входит набор интерфейсов прикладного программирования (API), которые позволяют приложениям Java™ 2 Platform, Enterprise Edition (J2EE) параллельно выполнять свои задачи. Асинхронный bean-компонент – это объект Java или Enterprise JavaBeans (EJB), который может асинхронно выполняться приложением J2EE. При этом bean-компонент использует контекст J2EE своего создателя. Имеются следующие типы асинхронных bean-компонентов:
-
Work – это объект, который реализует интерфейс
com.ibm.websphere.asynchbeans.Work. Объект выполняется параллельно с вызывающим объектом с помощью метода WorkManager.startWork.
-
AlarmListener – это объект, который реализует интерфейс
com.ibm.websphere.asynchbeans.AlarmListener. Он вызывается по завершении выдачи краткосрочного предупреждения.
-
EventListener – объект, который может реализовывать любой интерфейс. Он представляет собой облегченный механизм асинхронного уведомления для асинхронных событий, возникающих в пределах одной виртуальной машины Java (JVM). Его основная область применения – компоненты J2EE в составе одного EAR-файла, сигнализирующие друг другу о различных асинхронных событиях приложения.
Подробнее узнать об асинхронных bean-компонентах можно в Руководстве по программированию bean-компонентов и на других ресурсах, приведенных в разделе «Ресурсы» в конце этой статьи.
В следующем разделе описывается, как асинхронные bean-компоненты могут быть использованы в Web-сервисах.
Использование асинхронных bean-компонентов в Web-сервисах
Примечание. О том, как создавать Web-сервисы Java, можно узнать в руководстве IBM "WebSphere Version 6 Web Services Handbook Development and Deployment" (EN) (Справочник по разработке и развертыванию Web-сервисов WebSphere Version 6).
Рассмотрим Web-сервис, который извлекает данные с двух различных ресурсов для выполнения определенных операций бизнес-логики. Вы можете использовать здесь объект Work (один из представителей асинхронных bean-компонентов) для объединения этих двух задач (выборка данных с ресурсов). Теперь вы можете выполнять эти две задачи параллельно. В качестве примера возьмем Web-сервис, который объединяет содержимое двух файлов и возвращает этот объединенный контент. Код, представленный в листингах 1 и 2, иллюстрирует, как bean-компонент Java используется для создания этого Web-сервиса.
Листинг 1. Bean-компонент Java, используемый для создания Web-сервиса
package com.demo.asynbean.ws;
import java.util.ArrayList;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.ibm.websphere.asynchbeans.WorkException;
import com.ibm.websphere.asynchbeans.WorkItem;
import com.ibm.websphere.asynchbeans.WorkManager;
/**
* Создан 9 июля 2007 г.
*
* @author Shailesh K Mishra (shailekm@in.ibm.com)
*
*/
public class WSAsyncBean {
WorkManager workManager = null;
/**
*
*/
public WSAsyncBean() {
super();
// Автоматически генерируемый
// конструктор stub
}
public String getContent() {
String str = "";
// Сначала получить экземпляр WorkManager
if (workManager == null)
getWorkManager();
try {
WorkItem item = workManager.startWork
(new FetchFileContentTask("1.txt"));
WorkItem item1 = workManager.startWork
(new FetchFileContentTask("2.txt"));
// Создание объекта ArrayList
ArrayList items = new ArrayList();
// Добавление предыдущего объекта WorkItems в объект ArrayList
items.add(item);
items.add(item1);
// Объединение с использованием метода
// workManager объекта WorkManager
workManager.join(items, WorkManager.JOIN_AND,(int)
WorkManager.INDEFINITE);
FetchFileContentTask task1 = (FetchFileContentTask)
item.getResult();
FetchFileContentTask task2 = (FetchFileContentTask)
item1.getResult();
String contentFromFile1 = task1.getContent();
String contentFromFile2 = task2.getContent();
str = contentFromFile1 + contentFromFile2;
} catch (WorkException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
/**
*
*/
private void getWorkManager() {
try {
InitialContext ic = new InitialContext();
workManager = (WorkManager)
ic.lookup("java:comp/env/wm/myWorkManager");
} catch (NamingException e) {
// Автоматически генерируемый блок catch
e.printStackTrace();
}
}
}
|
Листинг 2. Класс Java, реализующий интерфейс Work
package com.demo.asynbean.ws;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import com.ibm.websphere.asynchbeans.Work;
/**
* Создан 7 июля 2007 г.
* @author Shailesh K Mishra (shailekm@in.ibm.com)
*
*/
public class FetchFileContentTask implements Work {
String fileName = "";
String content ="";
public FetchFileContentTask(String filename) {
super();
this.fileName = filename;
}
/*
* (non-Javadoc)
* @see javax.resource.spi.work.Work#release()
*/
public void release() {}
/*
* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
StringBuffer buffer = new StringBuffer();
// Чтение текстового файла, представленного в корневом каталоге.
try {
/*
* Чтение текстового файла с заданным именем,
* содержащимся в корневом каталоге этого приложения (для примера).
* Здесь вы можете выполнить любую задачу, например
* извлечение информации из БД, вызов другого приложения,
* web-сервиса и т. д.
*/
URL url = new URL("http://localhost:9080/WSAsynBeans/"+fileName);
InputStream in = url.openConnection().getInputStream();
BufferedReader br = new BufferedReader(new
InputStreamReader(in));
String line=br.readLine();
while (line != null) {
try {
buffer.append(line);
line=br.readLine();
}catch (IOException ioe) {
ioe.printStackTrace();
break;
}
}
content = new String(buffer);
} catch (NamingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @return Returns the name.
*/
public String getContent() {
return content;
}
}
|
В листинге 1 класс bean-компонента получает ссылку на объект по умолчанию WorkManager, вызывая метод getWorkManager. Затем он инициирует задачи извлечения контента из двух исходных файлов (заключенных в класс FetchFileContentTask), вызывая метод startWork объекта WorkManager. Класс FetchFileContentTask реализует интерфейс Work, который предоставляет возможности для реализации двух методов – запуска и освобождения. В листинге 2 представлен код для класса FetchFileContentTask. После успешного параллельного выполнения двух задач вы извлекаете файловый контент, сформированный этими задачами, и объединяете его. Наконец, объединенная строка возвращается Web-сервисом.
Заключение
В этой статье вы узнали, как использовать асинхронные bean-компоненты в Web-сервисах для повышения их производительности. Преимущество использования асинхронных bean-компонентов состоит в том, что они позволяют Web-сервису выполнять задачи одновременно, как параллельные потоки. При этом потоки выполняются в том же самом контексте, что и их создатель.
Ресурсы Научиться
Получить продукты и технологии
Обсудить
Об авторе  | |  | Шайлеш К. Михра (Shailesh K. Mishra) – инженер-программист, работающий в лаборатории India Software Lab, Гургаон (Индия). В настоящее время трудится над бизнес-портлетами в качестве разработчика технологии IBM Portlet. |
Выскажите мнение об этой странице
|  |