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

developerWorks Россия  >  SOA и Web-сервисы  >

Совет по Web-сервисам: Применение асинхронных bean-компонентов для повышения производительности Web-сервисов

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

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

Обсудить


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

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


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

Шайлеш К. Михра, инженер-программист, 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-сервисом.



В начало


Заключение

Поделиться этой статьей...

digg Разместить на Digg
del.icio.us Разместить на del.icio.us
Slashdot Разместить на Slashdot

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



Ресурсы

Научиться

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

Обсудить


Об авторе

Шайлеш К. Михра (Shailesh K. Mishra) – инженер-программист, работающий в лаборатории India Software Lab, Гургаон (Индия). В настоящее время трудится над бизнес-портлетами в качестве разработчика технологии IBM Portlet.




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


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



 


 


 


Поделиться этой статьей:

забобрить забобрить memori сохранить в memori




В начало


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