Skip to content
March 15, 2012 / ahriman hpc mode

Windows Azure & Java. Использование Service Runtime Library

——-
Цикл “Windows Azure & Java”:

Windows Azure, приложение на Java “Hello World” с использованием JDK 1.6 и Tomcat 7.
Windows Azure, приложение на Java “Hello World” с использованием JDK 1.6 и Glassfish 3 Windows Azure, приложение на Java. Service Runtime Library.

Вопросы отладки Java-приложений
——-

Теория

Windows Azure SDK For Java предоставляет библиотеку Windows Azure Service Runtime, позволяющую взаимодействовать приложению, написанному на Java, со средой Windows Azure (локальным эмуляторм или облаком) и получать информацию о развертывании (информацию о состоянии ролей, экземпляров и т.д.), а также запрашивать и задавать некоторые значения, включая запросы на “очистку” экземпляров роли.

К основным классам данной библиотеки относятся:

* RoleEnvironment

* RoleInstance

* Role

Всего в библиотеке гораздо больше классов, которые можно изучить на MSDN.

Рассмотрим подробнее каждый из классов.

RoleEnvironment

Данный класс является отображением среды выполнения Windows Azure, в которой работает экземпляр вашего приложения. Класс предоставляет следующую функциональность (список неполон):

static void
clearStatus()
Очистка статуса экземпляра роли.

static Map<String,String>
getConfigurationSettings()
Получение настроек, хранящихся в файле конфигурации роли.

static RoleInstance
getCurrentRoleInstance()
Возвращает объект типа RoleInstance, отображающий экземпляр роли, в котором выполняется приложение в данный момент.

static String
getDeploymentId()
Возвращает идентификатор развертывания, уникальное идентифицирующий развертывание, в котором выполняется экземпляр. Возвращает ID в форуме deployment(nn), где nn – integer в случае выполнения в локальном эмуляторе и GUID в случае выполнения в облаке.

static Map<String,LocalResource>
getLocalResources()
Возвращает набор именованных ресурсов локального хранилища, зарезервированных в файловой системой виртуальной машиной, в котором выполняются экземпляр роли. Возвращаемая коллекция содержит набор объектов LocalResources. Список локальных ресурсов определяется в файле определения сервиса.

static Map<String,Role>
getRoles()
Возвращает набор объектов типа Role, определенных в вашем приложении.

static boolean
isAvailable()

Определяет, запущено ли приложение в облаке или нет. Возвращает true, если да. Если возвращается false, запрещено использовать любые части класса RoleEnvironment (будет выброшено исключение RoleEnvironmentAvailableException).

static boolean
isEmulated()
Определяет, запущено ли приложение в локальном эмуляторе или нет. Возвращает true, если да.

static void
requestRecycle()
Запрашивает перезапуск экземпляра роли.

static void
setStatus(
RoleInstanceStatus status, Date expiration_utc)
Устанавливает статус экземпляра роли.

RoleInstance

Класс RoleInstance является отображением конкретного экземпляра роли и содержит в себе следующую функциональность:

getFaultDomain()
Возвращает значение типа Integer, отображающее домен неисправности, в котором расположен экземпляр.

String
getId()
Возвращает идентификатор экземпляра.

Map<String,RoleInstanceEndpoint>
getInstanceEndpoints()
Возвращает набор точек входа экземпляра роли.

Role
getRole()
Возвращает объект типа Role для данного экземпляра.

int
getUpdateDomain()
Возвращает значение типа Integer, отображающее домен обновления, в котором находится экземпляр.

Role

Класс Role является отображением роли в вашем приложении. Роли (веб-роль, воркер-роль) определяются в файле определения сервиса. Класс содержит всего два метода:

Map<String,RoleInstance>
getInstances()
Возвращает набор экземпляров для данной роли.

String
getName()
Возвращает имя роли, прописанное в файле определения сервиса.

Межклассовые отношения RoleEnvironment, Role, RoleInstance

  • Метод RoleEnvironment.getCurrentRoleInstance возвращает экземпляр роли типа RoleInstance, с помощью которого можно получить различные данные об экземпляре, такие как домены неисправностей и обновления, точки входа и так далее.
  • Метод RoleEnvironment.getRoles возвращает набор ролей вашего сервиса.
  • Метод RoleInstance.getRole возвращает объект типа Role, ассоциированный с ролью экземпляра, с помощью которого вы можете получить имя роли для данного экземпляра.
  • Метод Role.getRoleInstances возвращает набор экземпляров ролей.

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

* RoleInstanceEndpoint. Данный класс отображает точку входа для экземпляра роли и содержит следующие методы:

InetSocketAddress
getIpEndPoint()
Возвращает объект типа InetSocketAddress , отображающий точку входа для экземпляра роли.

String
getProtocol()
Возвращает протокол точки входа.

RoleInstance
getRoleInstance()
Возвращает объект типа RoleInstance, к которому принадлежит данная точка входа.

* RoleEnvironmentChangedEvent. Данный класс отображает событие, которое совершается во время изменения конфигурации сервиса. Содержит один метод:

Collection<RoleEnvironmentChange>
getChanges()
Возвращает набор изменений конфигурации, которые были применены к экземпляру роли.

* RoleEnvironmentConfigurationSettingChange . Данный класс является отображением изменения конфигурации и содержит один метод:

String
getConfigurationSettingName()
Возвращает имя настройки конфигурации, которая была изменена.

* RoleEnvironmentTopologyChange отображает изменение топологии сервиса. Топология сервиса – количество экземпляров для роли. Содержит один метод:

String
getRoleName()
Возвращает имя роли, над которой было совершено изменение.

* RoleInstanceStatus . Данное перечисление (enum) является отображением статуса экземпляра роли и содержит две константы:

Busy
Экземпляр не будет отвечать на запросы.

Ready
Экземпляр готов отвечать на запросы.

 

Практика

Для разработки на Java для платформы Windows Azure необходимо иметь:

1) Java Developer Kit не ниже 1.6 (под 1.7 данное руководство не тестировалось)

2) Windows Azure SDK.

3) Необходимые библиотеки Java. Можно скачать и подключить к проекту либо вручную, либо с помощью Maven, либо установив плагин к Eclipse. Ссылки: http://msdn.microsoft.com/en-us/library/windowsazure/hh690953(v=vs.103).aspx

4) Аккаунт Windows Azure.

5) Дистрибутив Tomcat 7-й версии.

Имея все 5 позиций, вы можете начать разрабатывать ваши проекты либо переносить уже существующие в облако.

В первой статье цикла я приводил настройки проекта. Для дальнейшей работы можно работать прямо из проекта из первой статьи, редактируя лишь файл .JSP. В практической же части мы попробуем выполнить новый код, использующий основные возможности Service Runtime Library, с использованием Tomcat 7.

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

1) Вызовите окно Properties вашего Java-проекта (не облачного!).

2) Переходим на вкладку Java Build Path и нажимаем Add External JARs.

image

3) Выбираем скачанные с сайта JAR (рис.7.).

image

Нажимаем Finish.

Java-проект с подключенными библиотеками, необходимыми для работы с Windows Azure, создан.

Теперь нам необходимо добавить библиотеки в сборку развертывания. Для этого:

снова вызовите окно свойств Properties вашего Java-проекта и перейдите на вкладку Deployment Assembly, после чего нажмите Add и в появившемся диалоге New Assembly Directive нажмите Java Build Path Entries. Next.

 

image

Теперь откройте JSP-файл, который вы должны отредактировать в соответствии с кодом ниже.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" import="com.microsoft.windowsazure.serviceruntime.*, java.util.Map, java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hello</title>
</head>
<body>
 <b>Hello Azure!</b>
 <br/>
 <p> RoleEnvironment.isEmulated() возвратил <%=RoleEnvironment.isEmulated() %>.</p>
 <p>Идентификатор экземпляра роли равен <%= RoleEnvironment.getCurrentRoleInstance().getId() %>.</p>
 <p>Имя роли: <%= RoleEnvironment.getCurrentRoleInstance().getRole().getName() %>.</p>
 <%
    Map<String, RoleInstanceEndpoint> endpoints = 
        RoleEnvironment.getCurrentRoleInstance().getInstanceEndpoints();

    for (Map.Entry<String, RoleInstanceEndpoint> entry : endpoints.entrySet())
    {
         out.println("Точка входа '" + entry.getKey() + 
             "' : " + entry.getValue().getIpEndPoint().getAddress().getHostAddress());
    }

    Map<String, LocalResource> localresources = RoleEnvironment.getLocalResources();

    Set set = localresources.entrySet(); 

    Iterator iterator = set.iterator();

    LocalResource localResource;

    while (iterator.hasNext())

    {

    Map.Entry entry = (Map.Entry)iterator.next();

    localResource = (LocalResource) entry.getValue(); 

    out.println("Локально зарезервированные файловые ресурсы: \n Название: " + localResource.getName() + "Путь: " + localResource.getRootPath()+"\n Максимальный размер (Мб): " 
    + localResource.getMaximumSizeInMegabytes()+"\n");

    };

    Map<String, String> mapConfigSettings = RoleEnvironment.getConfigurationSettings();

    String mysetting = mapConfigSettings.get("name");
    out.println(mysetting);

  %>
</body>
</html>

Соберите проект – Project => Build Project. После этого вам необходимо экспортировать пакет Java-проекта. Для этого кликните правой кнопкой мыши на проекте AzureLocApp и нажмите Export=>WAR File. В появившемся диалоговом окне нажмите Browse и выберите папку approot проекта Windows Azure.

 

 

Соберите облачный проект – Project=> Build Project. В окне в нижней части среды разработки должен появиться лог сборки. Убедитесь, что сборка прошла без проблем. Возможно, вам придется вручную запустить Windows Azure Emulator, иначе возможно появление ошибок.

Из вашего проекта запустите RunInEmulator.cmd.

После того, как вы запустите файл, произойдет развертывание проекта в локальный эмулятор вычислений Windows Azure. Откройте графический интерфейс локального эмулятора вычислений.

image

image

Нажмите на WorkerRole1 и выберите 0. Это экземпляр нашей роли.

image

Вы должны увидеть статус Busy. В это время запускается веб-сервер. Если он сразу не запустился, подождите – это занимает какое-то время.

После запуска веб-сервера зайдите в веб-браузере на http://localhost:8080/AzureLocApp, чтобы увидеть нашу страницу..

image

image

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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: