——- 
Цикл "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 
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-приложения. Аналогичным образом осуществляется взаимодействие с облачной средой.