Windows Azure SDK For Java предоставляет библиотеку Windows Azure Service Runtime, позволяющую взаимодействовать приложению, написанному на Java, со средой Windows Azure (локальным эмуляторм или облаком) и получать информацию о развертывании (информацию о состоянии ролей, экземпляров и т.д.), а также запрашивать и задавать некоторые значения, включая запросы на “очистку” экземпляров роли.
К основным классам данной библиотеки относятся:
* RoleEnvironment
* RoleInstance
* Role
Всего в библиотеке гораздо больше классов, которые можно изучить на MSDN.
Рассмотрим подробнее каждый из классов.
Данный класс является отображением среды выполнения 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 является отображением роли в вашем приложении. Роли (веб-роль, воркер-роль) определяются в файле определения сервиса. Класс содержит всего два метода:
Map<String,RoleInstance> getInstances() Возвращает набор экземпляров для данной роли.
String getName() Возвращает имя роли, прописанное в файле определения сервиса.
Кроме вышеперечисленных классов библиотека имеет дополнительную функциональность, которая может быть полезна при разработке облачного приложения. К этой функциональности относятся некоторые классы:
* 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.
3) Выбираем скачанные с сайта JAR (рис.7.).
Нажимаем Finish.
Java-проект с подключенными библиотеками, необходимыми для работы с Windows Azure, создан.
Теперь нам необходимо добавить библиотеки в сборку развертывания. Для этого:
снова вызовите окно свойств Properties вашего Java-проекта и перейдите на вкладку Deployment Assembly, после чего нажмите Add и в появившемся диалоге New Assembly Directive нажмите Java Build Path Entries. Next.
Теперь откройте 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. Откройте графический интерфейс локального эмулятора вычислений.
Нажмите на WorkerRole1 и выберите 0. Это экземпляр нашей роли.
Вы должны увидеть статус Busy. В это время запускается веб-сервер. Если он сразу не запустился, подождите – это занимает какое-то время.
После запуска веб-сервера зайдите в веб-браузере на http://localhost:8080/AzureLocApp, чтобы увидеть нашу страницу..
Таким образом, мы увидели, как можно взаимодействовать со средой выполнения локального эмулятора из Java-приложения. Аналогичным образом осуществляется взаимодействие с облачной средой.