Java SDK для Azure - ошибка с RoleEnvironment.getCurrentRoleInstance () - PullRequest
0 голосов
/ 23 февраля 2012

Я развернул рабочую роль с Tomcat 7 и очень простым тестовым сервлетом, который должен просто отображать идентификатор обслуживающего экземпляра (я хочу протестировать решение для управления сеансом в нескольких экземплярах).

Я использую Azure SDK для Java (github.com/WindowsAzure/azure-sdk-for-java)

Проблема в том, что Tomcat выдает ошибку, когда я вызываю следующее:

RoleEnvironment.getCurrentRoleInstance().getId()

Фактическая ошибка:

com.microsoft.windowsazure.serviceruntime.RoleEnvironmentNotAvailableException
com.microsoft.windowsazure.serviceruntime.RoleEnvironment.initialize(RoleEnvironment.java:77)
com.microsoft.windowsazure.serviceruntime.RoleEnvironment.getCurrentRoleInstance(RoleEnvironment.java:331)
com.anubex.test.TestSessionServlet.doGet(TestSessionServlet.java:35)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause

java.lang.RuntimeException: java.io.FileNotFoundException: \\.\pipe\WindowsAzureRuntime (The system cannot find the file specified)
com.microsoft.windowsazure.serviceruntime.FileInputChannel.getInputStream(FileInputChannel.java:33)
com.microsoft.windowsazure.serviceruntime.RuntimeVersionProtocolClient.getVersionMap(RuntimeVersionProtocolClient.java:41)
com.microsoft.windowsazure.serviceruntime.RuntimeVersionManager.getRuntimeClient(RuntimeVersionManager.java:48)
com.microsoft.windowsazure.serviceruntime.RoleEnvironment.initialize(RoleEnvironment.java:74)
com.microsoft.windowsazure.serviceruntime.RoleEnvironment.getCurrentRoleInstance(RoleEnvironment.java:331)
com.anubex.test.TestSessionServlet.doGet(TestSessionServlet.java:35)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause

java.io.FileNotFoundException: \\.\pipe\WindowsAzureRuntime (The system cannot find the file specified)
java.io.FileInputStream.open(Native Method)
java.io.FileInputStream.<init>(FileInputStream.java:120)
java.io.FileInputStream.<init>(FileInputStream.java:79)
com.microsoft.windowsazure.serviceruntime.FileInputChannel.getInputStream(FileInputChannel.java:30)
com.microsoft.windowsazure.serviceruntime.RuntimeVersionProtocolClient.getVersionMap(RuntimeVersionProtocolClient.java:41)
com.microsoft.windowsazure.serviceruntime.RuntimeVersionManager.getRuntimeClient(RuntimeVersionManager.java:48)
com.microsoft.windowsazure.serviceruntime.RoleEnvironment.initialize(RoleEnvironment.java:74)
com.microsoft.windowsazure.serviceruntime.RoleEnvironment.getCurrentRoleInstance(RoleEnvironment.java:331)
com.anubex.test.TestSessionServlet.doGet(TestSessionServlet.java:35)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Кажется, проблема в том, что не может быть найден следующий именованный канал:

\\.\pipe\WindowsAzureRuntime

Не уверен, как / где это создается. Есть идеи?

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Я наткнулся на ту же проблему и это описание помощи: http://msdn.microsoft.com/en-us/library/hh690948(VS.103).aspx

Надеюсь, это поможет,

Patriek

1 голос
/ 15 февраля 2013

Полагаю, вы используете AzureRunMe для запуска проекта Java. В среде выполнения службы Windows Azure есть два механизма предоставления информации RoleEnviroment. Первый - через сборку .NET, второй - через именованный канал Windows. Первый метод предназначен для использования приложениями .NET, второй метод предназначен для приложений, написанных не на языках .NET. Однако второй метод будет недоступен, если не запустить программу через ProgramEntryPoint в файле ServiceDefinition.

Сценарий, с которым вы столкнулись, заключается в том, что AzureRunMe запускается с помощью первого метода, но Java SDK пытается получить доступ к RoleEnviroment с помощью второго метода. Это не удалось в то время.

Есть две стратегии смягчения, которые заслуживают изучения. A. обновите AzureRunMe , чтобы предоставить информацию о RoleEnviroment для Java. Б. Запустите AzureRunMe через ProgramEntryPoint. Мне было бы любопытно, как это происходит.

1 голос
/ 23 февраля 2012

RoleEnvironmentNotAvailableException сообщает, что код не выполняется в контексте роли Azure. При разработке приложения для Azure ваше приложение может находиться в контексте роли Azure двумя способами: оно либо выполняется в облаке на серверах Azure, либо выполняется в эмуляторе вычислений, являющемся частью Azure SDK.

В вашем случае, похоже, вы не работаете в облаке и не работаете в эмуляторе, поэтому выдается исключение. Чтобы решить эту проблему, вам нужно настроить свой проект на использование эмулятора. Вот пошаговое руководство о том, как это сделать: http://msdn.microsoft.com/en-us/library/windowsazure/hh690944(v=vs.103).aspx

В качестве примечания вы можете проверить, выполняете ли вы в контексте роли Azure, проверяя RoleEnvironment.isAvailable (), и вы можете проверить, эмулируется ли она (т. Е. Работает в процессе разработки или выполняется в облаке) путем проверки RoleEnvironment.isEmulated ().

...