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

Цикл "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-приложений. 
Дополнительные возможности. Remote Desktop, Session Affinity. 
Windows Azure & Java. Основы хранилища. Блобы. Доступ из локального приложения. 
Windows Azure & Java. Основы хранилища. Очереди. Доступ из локального приложения.
Windows Azure & Java. Что такое Service Bus и как её использовать из Java-приложения. Часть 1.
Windows Azure & Java. Что такое Service Bus и как её использовать из Java-приложения. Часть 2. Топики. 

Теория

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 
isAvai  
lable()

Определяет, запущено ли приложение в облаке или нет. Возвращает 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. Ссылки: https://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. В это время запускается веб-сервер. Если он сразу не запустился, подождите – это занимает какое-то время.

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

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