Grasshopper 2.0 技术预览:编写 .NET 2.0 代码,构建 Java,运行 Linux





0/5 (0投票)
2006 年 9 月 18 日
8分钟阅读

40480

146
使用 Visual Studio 2005 IDE、C# 2.0 功能和 ASP.NET 2.0 控件测试下一代跨平台开发。在运行 Tomcat 的 Linux 和其他支持 Java 的平台上重新编译和部署 C# Web 应用程序。
这是我们 CodeProject 赞助商的产品展示评测。这些评测旨在为您提供我们认为对开发人员有用且有价值的产品和服务信息。
使用 Visual MainWin for J2EE 和 OpenJMS 轻松实现消息传递
Java™ 应用程序中常用的一个 API 是 JMS API,它允许您实现托管消息传递和消息队列。当使用 Mainsoft 的 Visual MainWin for J2EE(又名 Grasshopper)时,您可以从 JAR 文件或 EJB 中使用 Java 资源。在本文中,您将学习如何在 Grasshopper 应用程序中使用 C# 或 VB.NET 直接与 OpenJMS 实现的此 API 的 Java 代码进行交互。然后,您可以使用它在 Visual Studio .NET® 开发环境中编写和调试 JMS 应用程序。
概述
Mainsoft 的 Grasshopper 2.0 技术预览 引入了对 Microsoft® Visual Studio® 2005 IDE 和 .NET Framework 2.0 的支持。借助它,您可以使用最新版本的 Visual Studio 软件、C# 2.0 功能和 ASP.NET 2.0 控件进行跨平台开发测试,并在具有 Tomcat 应用程序服务器的 Java 平台重新托管使用它们的应用程序。
Microsoft 于 2005 年底发布了 .NET 2.0,在 .NET 1.x 成功的基础技术之上引入了许多更高级的功能。改进的语言功能,如泛型和可空类型,以及更广泛的 ASP.NET Framework,使您能够快速开发多层 Web 站点。ASP.NET 2.0 引入了许多新的 Web 控件,以减少构建 Web 站点所需的代码量,改进了安全模型,增强了数据支持,以及主页等功能,使构建和维护 Web 站点更加容易。
入门
要开始,您需要 Grasshopper 1.7,可以从 Mainsoft 网站下载。您还需要 Tomcat 5.5,它将作为 Grasshopper 安装的一部分进行安装。如果您想使用 IBM WebSphere®、BEA WebLogic® 或 JBoss®,也可以这样做,但您需要 Visual MainWin® for J2EE™ 的企业版,可以从同一个地方下载。
最后,您需要一个消息服务器,我推荐并且在本文中使用的是 OpenJMS 服务器,它是 Tomcat 的标准消息队列 MOM(消息导向中间件)。您可以从 SourceForge 下载。
安装 OpenJMS 非常简单。只需下载二进制文件,然后解压到您的硬盘驱动器。然后,将环境变量 OPENJMS_HOME
设置为您解压的位置。在我的例子中,我将它们放在目录 C:\jms\openjms-0.7.7-alpha-3 中,并据此将系统环境变量设置为此值。要在 Windows 中执行此操作,请右键单击桌面上的“我的电脑”,然后选择“属性”。
然后,在“高级”选项卡(图 1)中,选择“环境变量”。
图 1. 环境变量设置。
对话框将显示用户变量和系统变量(图 2)。
图 2. 环境变量对话框
在系统变量区域,单击“新建”,然后输入变量名和值,如图 3 所示。请注意,您的系统上的变量值可能不同。您应该将其设置为解压 OpenJMS 的目录名称。
图 3. 设置环境变量
如果您系统中没有 JRE 或 JDK,您应该下载并安装一个,并确保您的 JAVA_HOME
系统变量已设置为其安装目录。标准 JRE 安装的默认值是 C:\Program Files\Java\jre1.5.0_06。
在设置好所有这些之后,从 DOS 命令,切换到 OpenJMS 安装目录下的“bin”目录,然后发出“openjms run”命令。您应该看到如图 4 所示的输出。
图 4. 在命令控制台中运行 OpenJMS
构建消息命名空间
下一步是构建消息命名空间。它将包含您用于包装底层 JMS API 的类,以便在应用程序中简单使用。从 Visual Studio .NET,执行 文件->新建->项目 请求,并从“Visual MainWin C# for J2EE Projects”文件夹中选择“类库”。(参见图 5。)
图 5. 创建新的 System.Messaging 命名空间
这将创建一个新的类库,其中包含一个名为“Class1.cs”的类。删除此库中的所有代码,并用本文下载中的 System.Messaging
代码替换它。
接下来,您需要添加对 OpenJMS 的 JAR 文件的引用。您可以通过右键单击“解决方案资源管理器”中的“引用”节点,然后选择“添加 Java 引用”来完成此操作。这将打开一个通用对话框。使用它浏览到 OpenJMS 安装目录下的“lib”目录。例如,如果您将 OpenJMS 文件解压到 C:\jms 目录,则浏览到 C:\jms\openjms-0.7.7-alpha-3\lib。
选择这些 JAR 文件以添加引用 - 导入可能需要几分钟才能完成
- commons-codec-1.3.jar
- commons-logging-1.0.4.jar
- concurrent-1.3.4.jar
- jms-1.1.jar
- jndi-1.2.1.jar
- openjms-0.7.7-alpha-1.jar
- openjms-common-0.7.7-alpha-1.jar
- openjms-net-0.7.7-alpha-1.jar
- spice-jndikit-1.1.jar
现在您应该可以编译您的类库了。如果您遇到任何编译错误,请检查您是否正确导入了上面提到的所有 JAR 文件。如果不行,此库的完整 Visual Studio 解决方案可在下载中找到。
构建消息发送器
接下来,您将构建一个简单的控制台应用程序,用于将消息发送到消息队列。得益于您上面构建的类库,这变得非常简单。
开始时,在 Visual Studio .NET 中选择 文件->新建->项目。从“Visual MainWin C# for J2EE”文件夹中选择“控制台应用程序”,并将其命名为“Message Sender”。
解决方案创建完成后,添加对 System.Messaging.jar 的 JAR 引用 - 即您之前构建的类库。除非您已将其部署到其他地方,否则您将在其项目文件夹中找到它。
然后,添加与创建库时相同的 JAR Java 引用。
在 Class1.cs 的顶部,添加以下“using
”指令
using System;
using System.Messaging;
using javax.naming;
using javax.jms;
最后,在 Main
方法中,您将添加实现消息队列的代码。您将从设置消息传递环境的代码开始,方法是设置其 Context
对象上的属性
static void Main(string[] args)
{
java.util.Hashtable properties = new java.util.Hashtable();
properties.put(Context__Finals.PROVIDER_URL, "tcp://:3035");
properties.put(Context__Finals.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
properties.put(Context__Finals.SECURITY_PRINCIPAL, "admin");
properties.put(Context__Finals.SECURITY_CREDENTIALS, "openjms");
要了解和更多了解这些属性及其功能,请查看 OpenJMS 文档。
在 Main
方法的其余部分,您将发送十条带有当前时间的 currentDate 和 currentTime 消息到消息队列。即使监听器未激活,也可以安全运行。OpenJMS 会为您处理队列,直到您准备好取出它们。
string queueServer = "localhost";
string queueName = "queue1";
int N = 10;
if (args != null && args.Length > 0)
{
N = Convert.ToInt32(args[0]);
}
for (int i = 0; i < N; i++)
{
System.Messaging.Message theMessage = new System.Messaging.Message();
theMessage.Body = "test value " + i
+ " " + System.DateTime.Now.ToShortTimeString();
MessageQueue mq = new MessageQueue("FormatName:DIRECT=OS:" +
queueServer + "\\" + queueName);
mq.Send(theMessage);
Console.WriteLine("Sent Message: {0}", theMessage.Body);
}
Console.ReadLine();
java.lang.System.exit(0);
}
运行此应用程序将发送参数中指定的数量的消息到队列,如果没有参数,则发送 10 条消息,如图 6 所示。此应用程序的核心在于 for
循环。它只是设置一个 System.Messaging.Message
对象(在您之前创建的类库中找到),并将其主体初始化为字符串“test value”以及当前日期和时间。然后,它实例化一个消息队列对象,并使用本地服务器和名为 queue1
的队列进行设置,queue1
是 OpenJMS 中预定义的队列。然后,调用此队列上的 Send
方法,并将消息作为参数传递。非常简单!
图 6. 运行消息发送器
此时,消息已由您的消息发送器分派,并位于 OpenJMS 管理的队列中等待被拾取。我们不要让它们等待太久,而是编写一个简单的读取器来从队列中取出它们!
构建消息读取器
按照与上面创建 MessageSender 项目相同的步骤,创建一个名为“MessageGetter”的控制台应用程序,它将获取消息。请确保添加与该项目相同的引用,即对 OpenJMS jar 的八个引用,以及对您之前创建的 System.Messaging
类库的引用。
然后,将与之前相同的“using
”指令添加到 Class1.cs 的顶部。
最后,这是您类的 Main
方法
static void Main(string[] args)
{
java.util.Hashtable properties = new java.util.Hashtable();
properties.put(Context__Finals.PROVIDER_URL, "tcp://:3035");
properties.put(Context__Finals.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
properties.put(Context__Finals.SECURITY_PRINCIPAL, "admin");
properties.put(Context__Finals.SECURITY_CREDENTIALS, "openjms");
string queueServer = "localhost";
string queueName = "queue1";
int N = 10;
if (args != null && args.Length > 0)
{
N = Convert.ToInt32(args[0]);
}
for (int i = 0; i < N; i++)
{
MessageQueue mq = new MessageQueue("FormatNameIRECT=OS:" +
queueServer + "\\" + queueName);
System.Messaging.Message theMessage = mq.Receive();
Console.WriteLine("Received message: {0}", theMessage.Body);
}
}
运行此应用程序将显示图 7 的输出。您将看到它接收了发送器发送的每条消息。代码与发送器非常相似。您设置一个 MessageQueue
对象,然后使用 Receive()
方法监听它。该方法返回一个消息对象,您可以通过“Body
”属性查询其内容。
图 7. 运行消息接收应用程序
结论
Grasshopper 不仅限于其直接支持的 .NET 命名空间。由于 Java 引用可以直接插入您的应用程序,并且 Java 源代码可以与您的 C# 或 VB.NET 代码内联运行,因此您可以轻松使用外部 Java API。
在本文中,您学习了如何在 Visual Studio .NET 中使用 OpenJMS 服务器上的 JMS 消息传递,并了解了将消息发送到队列并从中获取消息的简便性。您实现的 System.Messaging
类库可以轻松地在您的应用程序中重用,因此您可以继续通过 Grasshopper 实现 .NET 应用程序与 JMS 的互操作!
感谢 Laurence Moroney 对本文的润色。