0

我已经使用 Tomcat 7 和一个非常简单的测试 servlet 部署了一个工作角色,它应该只显示服务实例的 ID(我想跨多个实例测试会话管理解决方案)。

我正在使用 Azure SDK for 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

不确定它是如何/在哪里创建的。有任何想法吗?

4

3 回答 3

1

RoleEnvironmentNotAvailableException 告诉你代码未在 Azure 角色的上下文中运行。在为 Azure 开发应用程序时,您的应用程序可以通过两种方式在 Azure 角色的上下文中运行:它要么在 Azure 服务器上的云中运行,要么在作为 Azure SDK 一部分的计算模拟器中运行。

在您的情况下,您似乎既没有在云中运行,也没有在模拟器中运行,因此引发了异常。要解决此问题,您需要设置项目以使用模拟器。这是有关如何执行此操作的演练:http: //msdn.microsoft.com/en-us/library/windowsazure/hh690944 (v=vs.103).aspx

作为旁注,您可以通过检查 RoleEnvironment.isAvailable() 来检查您是否在 Azure 角色的上下文中运行,并且您可以检查它是否被模拟(即,在开发中运行与在云)通过检查 RoleEnvironment.isEmulated()。

于 2012-02-23T15:28:10.370 回答
1

我偶然发现了同样的问题和帮助描述:http: //msdn.microsoft.com/en-us/library/hh690948 (VS.103).aspx

希望这可以帮助,

帕特里克

于 2012-03-05T10:04:55.193 回答
1

我猜你正在使用AzureRunMe来运行你的 Java 项目。在 Windows Azure Service Runtime 中,有两种机制来提供 RoleEnviroment 信息。第一个是通过 .NET 程序集,第二个是通过 Windows 命名管道。第一种方法适用于 .NET 应用程序,第二种方法适用于非 .NET 语言编写的应用程序。但是,除非通过 ServiceDefinition 文件中的 ProgramEntryPoint 启动程序,否则第二种方法将不可用。

您面临的情况是AzureRunMe通过第一种方法启动,但 Java SDK 试图通过第二种方法访问 RoleEnviroment。当时失败了。

有两种缓解策略值得探索。A. 更新AzureRunMe以向 Java 公开 RoleEnviroment 信息。B. 通过 ProgramEntryPoint 运行 AzureRunMe。我会很好奇它是怎么回事。

于 2013-02-15T18:13:39.787 回答