转载

将 Web 应用程序移植到 Bluemix 上

注册使用 IBM Bluemix ™

这个云平台提供了许多免费的服务、运行时和基础架构,可以帮助您快速构建和部署下一个移动或 Web 应用程序。

过去 10 年构建的大多数企业应用程序都是在应用程序服务器上运行的传统 Java™ 2 Platform, Enterprise Edition (J2EE) 应用程序。这些应用程序中将近 90% 都使用了数据库和其他功能,比如 Java Message Service (JMS)、邮件等。在本教程中,您将了解如何将一个 J2EE 应用程序迁移到 IBM® Bluemix™ 上。每个组件的移植过程(利用了 Bluemix 上提供的最新服务)将在以下步骤中介绍。

我们的示例 J2EE 应用程序是一个简单的培训应用程序,提供了让新用户注册并登录和查看可用培训的功能。用户可订阅一次培训,以便在任何新培训可用时,他或她将通过电子邮件获得通知。

本教程中提供的示例 J2EE 应用程序使用了传统的 Java Database Connectivity (JDBC)、JMS 和电子邮件功能。在此示例中,我们使用了 DB2® 数据库、JMS Default Messaging Provider,还使用了 JavaMail API 来发送电子邮件。在 Bluemix 中,我们使用 SQL Database 作为数据库,使用 MQ Light 服务取代 JMS,使用 SendGrid 服务发送电子邮件。该 Web 应用程序在 Liberty 服务器上运行。本教程演示了如何轻松地将每个 J2EE 组件移植到 Bluemix 上。

构建您的应用程序所需的准备工作

  • 熟悉 J2EE 编程
  • 一个 Bluemix 帐户
  • 安装了 Bluemix 插件的 Eclipse

运行应用程序

获取代码

第 1 步. 下载用于 Eclipse 的 IBM Bluemix 插件

  1. 单击 Help > Eclipse Marketplace
  2. 按单词 “Bluemix” 进行搜索。
  3. 选择 IBM Eclipse Tools for Bluemix将 Web 应用程序移植到 Bluemix 上
  4. 安装插件。
  5. Server 选项卡中,单击 New > Server > IBM > IBM Bluemix
  6. 输入您的 Bluemix 帐户的电子邮件 ID 和密码。
  7. 验证您的帐户。

第 2 步. 将项目导入 Eclipse 中

  1. 从项目页面的右侧复制 Git URL ( https://hub.jazz.net/git/kmalarvizhi/MigrateJ2EE/ )。
  2. 在 Eclipse 中,选择 File > Import
  3. 在 Import 窗口中,选择 Git > Projects from Git 并单击 Next
  4. 选择 Clone URI 并单击 Next
  5. 将复制的 Git URL 粘贴到 URI 字段中。在 Authentication 部分中输入您的 Jazz ID 和 IBM ID 密码。单击 Next
  6. 选择您想要处理的分支并单击 Next
  7. 如果需要,更新克隆的存储库的 Local Destination,然后单击 Next
  8. 单击 Next ,然后单击 Finish

第 3 步. 部署应用程序

在 DevOps Services 项目 MigrateJ2EE 中,您将找到两个 Eclipse 项目:Training(一个可部署在任何应用程序服务器中的传统 J2EE 应用程序)和 BlueTraining(一个应部署在 Bluemix 中的移植的应用程序)。以下步骤涉及 BlueTraining。

将应用程序部署在 Bluemix 上

  1. 右键单击 Bluemix 服务器并单击 Connect
  2. 右键单击 Bluemix 服务器并选择 Add and Remove...
  3. 从左侧窗口中选择您的 BlueTraining 项目并单击 Add
  4. 单击 Finish
  5. 为您的应用程序输入一个名称并选择 Next
  6. 部署的 URL 基于应用程序名称而构造。可更改它或保留默认值,然后单击 Next
  7. 创建并绑定一个 SQLDB 服务。如果 SQLDB 还未创建,则选择右上角的图标并选择 SQLDB。
  8. 最后单击 Finish 。您的应用程序现在应已发布到 Bluemix。
  9. 打开一个浏览器,输入 URL ( https://ace.ng.bluemix.net ) 以登录到 Bluemix。
  10. 单击 CATALOG 选项卡并在 Web and Application 节下选择服务 SendGrid 。在打开的窗口中,选择该应用程序作为 MyTrainingApp 并单击 Create 。现在,您的应用程序 MyTrainingApp 和 SendGrid 服务已绑定。
  11. 类似地,将 Web and Application 节下的服务 MQ Light 绑定到 MyTrainingApp。完成后,可看到您的应用程序已绑定到以下服务:Liberty for Java Runtime、SendGrid 服务、MQ Light 服务和 SQL 数据库服务。重新启动您的应用程序。 将 Web 应用程序移植到 Bluemix 上
  12. BlueTraining 项目下的 build.xml 文件可用于构建该项目,并生成 BlueTraining.war 文件。使用 cloud foundry 命令行工具部署 BlueTraining.war 文件,如下所示。从命令提示符运行以下命令:
    C:/bluemix> cf login -a https://api.ng.bluemix.net     [Enter your Bluemix credentials here.]     C:/bluemix> cf push MyTrainingApp -p BlueTraining.war

    备注:“MyTrainingApp” 是应用程序的名称。

  13. 在 Bluemix 中重新启动您的应用程序。
  14. 通过 http:// <appname> /login.html 访问该应用程序。您将看到一个类似下图的屏幕。 将 Web 应用程序移植到 Bluemix 上
  15. 如果您是一位新用户,则单击 register 链接添加您的用户细节。使用您的电子邮件 ID 和密码登录后,您将看到一个主页,其中显示了两个链接(参见下图)。单击 View all Trainings 获得培训列表。 将 Web 应用程序移植到 Bluemix 上

将您的应用程序部署到任何应用程序服务器上

  1. 在 Eclipse Luna 中,右键单击项目 Training 。选择选项 Export > Web > WAR File 。这将生成 Training.war 文件。将它保存到您的本地磁盘。
  2. 将该 war 文件安装到任何应用程序服务器中,记住提供 Training 作为您的应用程序的上下文根。
  3. 启动应用程序 Training。
  4. 通过 http://hostname:port/training/login.html 访问该应用程序。

第 4 步. 移植数据库作为 Bluemix 中的一个 SQLDB 服务

  1. 以 CSV 文件形式从您的传统 J2EE 应用程序导出您的表的内容。
  2. 访问 http://ace.ng.bluemix.net 登录到 Bluemix。
  3. 单击您的培训应用程序: sqldb service
  4. 在 Get Started 部分中,单击 Launch 。这将启动控制台,以便开始使用 SQL 数据库。
  5. 显示了 “Welcome to the Managed Database” 控制台。
  6. 单击 Load Data
  7. 在本地文件系统中浏览并选择 CSV 文件,如下所示。 将 Web 应用程序移植到 Bluemix 上
  8. 单击 Load File 选项。
  9. 将显示该表的预览。单击 Next
  10. Choose the target 选项卡中,您可载入一个现有的表,或者创建一个新表并加载。在此示例中,我们选择选项 create a new table 并加载。单击 Next
  11. Select a table 选项卡中,检查表名称,编辑列名称以与该表匹配,然后检查它们的数据类型和长度。 将 Web 应用程序移植到 Bluemix 上
  12. 最后单击 Finish

备注:配置这些表时,需要确保使用用户名作为模式名称,这是 Bluemix 的默认设置。可在 SQLDB 凭据下找到用户名。同样地,确保该表拥有一条包含电子邮件地址 admin@in.ibm.com 的记录。这使该应用程序支持您添加新培训。

类似地,对其他表(trainings 和 subscription)重复此过程。完成之后,数据库设置就完成了。现在已创建了表 users、trainings 和 subscription。

下一步是修改 TrainingDB (这个数据库实用程序类可在 BlueTraining 项目下找到)以使用 Bluemix 的 SQLDB API。修改 TrainingDB 类,以便从 SQL Database 服务构造 JDBC URL。在 TrainingDB.java 文件中查找用于在 BLuemix 中检索 SQLDB 服务连接细节的代码。下图显示了用于构造 JDBC URL 的 SQLDB 凭据。

将 Web 应用程序移植到 Bluemix 上

使用 SQL 数据库获取数据源的代码如下所示:

String VCAP_SERVICES = System.getenv("VCAP_SERVICES");                    if (VCAP_SERVICES != null) {          BasicDBObject obj = (BasicDBObject) JSON.parse(VCAP_SERVICES);          String thekey = null;          Set<String> keys = obj.keySet();          for (String eachkey : keys)          {           if (eachkey.toUpperCase().contains("SQLDB"))            thekey = eachkey;          }                     BasicDBList list = (BasicDBList) obj.get(thekey);           obj = (BasicDBObject) list.get("0");           obj = (BasicDBObject) obj.get("credentials");           databaseHost = (String) obj.get("host");           databaseName = (String) obj.get("db");           port = Integer.parseInt(obj.get("port").toString());           user = (String) obj.get("username");           password = (String) obj.get("password");           url = (String) obj.get("jdbcurl");           }            ds = new DB2SimpleDataSource();           ds.setServerName(databaseHost);           ds.setPortNumber(port);           ds.setDatabaseName(databaseName);           ds.setUser(user);           ds.setPassword (password);           ds.setDriverType(4);

第 5 步. 移植 JMS 以用作 Bluemix 中的 MQ Light 服务

在传统 J2EE 应用程序中,我们为 JMS 使用了 Default Messaging Provider。我们创建了一个服务集成总线 (JMSBus)、队列连接工厂 (jms/TrainingQCF) 和一个队列 (jms/TrainingQueue)。用户订阅一次培训时,该应用程序会在队列中放入一条消息(参见 JMSSender.java 类了解在队列中放入和获取消息的详细信息)。

以用户身份登录到应用程序,单击 Subscribe for Training 获得有关您感兴趣的培训的电子邮件通知。输入该培训并单击 Subscribe

将 Web 应用程序移植到 Bluemix 上

JMSScheduler.java 线程每 3 分钟运行一次并从队列中获取消息。它处理消息并向订阅表中插入一条记录,记录中包含订阅者的电子邮件 ID 和培训细节。

在 Bluemix 中,MQ Light 服务提供了 Java Messaging Service 功能来简化异步消息。使用 MQ Light,无需在应用程序服务器中创建或管理消息总线、连接工厂、队列或主题。我们修改了 JMSSender.java 类(这个实用程序类用于在 JMS 队列中获取和放入消息)以使用 MQ Light API。

在您的 J2EE web.xml 文件中,声明 ConnectionFactory ,需要它才能通过 MQ Light 服务在队列中放入和获取消息。

点击查看代码清单

关闭 [x]

<resource-ref>  <description>ConnectionFactory used to send and receive messages to and from the back-end worker. </description>  <res-ref-name>jms/mqlsampleservice</res-ref-name>  <res-type>javax.jms.ConnectionFactory</res-type>  <res-auth>Container</res-auth>  <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> 

在您的代码中,创建一个初始队列:

点击查看代码清单

关闭 [x]

InitialContext ctx = new InitialContext();  ConnectionFactory myCf = (ConnectionFactory) ctx.lookup("java:comp/env/jms/mqlsampleservice");  final Connection connection = myCf.createConnection();  final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  connection.start();            Queue myRequestQueue = session.createQueue("jms/requestQueue");  session.close();  connection.close(); 

用于将消息放入队列中的代码:

final Connection connection = myCf.createConnection();             final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  final MessageProducer producer = session.createProducer(myRequestQueue);  connection.start();  final ObjectMessage message = session.createObjectMessage(ntfyEvent);             producer.send(message);             producer.close();  session.close();  connection.close(); 

用于从队列获取消息的代码:

final Connection connection = myCf.createConnection();  final Session sess = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  connection.start();  final Queue queue = sess.createQueue("jms/requestQueue");  final MessageConsumer consumer = sess.createConsumer(queue);  while ( (omsg  = (ObjectMessage) consumer.receiveNoWait()) != null)  {      event = (NotifyEvent) omsg.getObject();      ntfEvents.add(event);  }      consumer.close();  sess.close();  connection.close(); 

这是让您的应用程序使用 JMS 所需的最精简的代码。

第 6 步. 移植电子邮件功能作为 Bluemix 中的一个 SendGrid 服务

在传统 J2EE 应用程序中,我们使用了 JavaMail API 来向订阅培训的用户发送电子邮件。只要管理员添加了一个培训,该应用程序就会检查订阅表,以查看是否有用户请求了该培训。如果存在一个订阅,将向该用户发送一封电子邮件。

在 IBM Bluemix 中,我们将尝试利用 SendGrid 所提供的新电子邮件功能。客户端可利用 SendGrid 的成熟交付基础架构,将一个基于云的简单电子邮件引擎集成到其 Web 和移动应用程序中。因为该应用程序绑定了 SendGrid 服务,所以它可使用 SendGrid API 发送电子邮件。

现在,在 Training 应用程序中,以管理员身份登录(电子邮件:admin@in.ibm.com)。单击 Add new Training 并添加培训 Bluemix

将 Web 应用程序移植到 Bluemix 上

该应用程序检查订阅表,发现用户 < your_userid > 已请求培训 Bluemix 。该应用程序立即向该用户发送一封电子邮件。检查您的收件箱,以确认该电子邮件已成功发送。

将 Web 应用程序移植到 Bluemix 上

我们修改了 EmailUtil.java 实用程序(用于发送电子邮件)以使用 SendGrid API。

使用 SendGrid 发送电子邮件的示例代码为:

String VCAP_SERVICES = System.getenv("VCAP_SERVICES");    String sendgrid_username  = null;    String sendgrid_password  = null;    if (VCAP_SERVICES != null)     {     BasicDBObject obj = (BasicDBObject) JSON.parse(VCAP_SERVICES);     String thekey = null;     Set<String> keys = obj.keySet();     for (String eachkey : keys)     {      if (eachkey.toUpperCase().contains("SENDGRID"))       thekey = eachkey;     }     BasicDBList list = (BasicDBList) obj.get(thekey);        obj = (BasicDBObject) list.get("0");        obj = (BasicDBObject) obj.get("credentials");        sendgrid_username = (String) obj.get("username");        sendgrid_password = (String) obj.get("password");    }   SendGrid sendgrid = new SendGrid(sendgrid_username, sendgrid_password);     sendgrid.addTo("malar@in.ibm.com");   sendgrid.setFrom("yyy@in.ibm.com");   sendgrid.setFromName("YYY");   sendgrid.setReplyTo("yyy@in.ibm.com");   sendgrid.setSubject("This is a test mail!");   sendgrid.setHtml("This is a test mail.");     sendgrid.send();   PrintWriter out = response.getWriter();   out.println ("Message sent"); 

就这么简单。我们已将我们的 J2EE Web 移植到 Bluemix 上提供的新服务。

本教程提供了使用所提供的最新服务将传统 J2EE 应用程序移植到 Bluemix 的详细步骤。教程和提供的示例代码介绍了如何将一个使用数据库、JMS 和电子邮件功能的应用程序移植到 Bluemix。大体上讲,本文快速、实践性地介绍了 IBM Bluemix,一个用于开发和部署 Web 和移动应用程序的开放 IBM 云平台。

BLUEMIX SERVICES USED IN THIS TUTORIAL:

  • SQL 数据库 向您的应用程序添加一个随需应变的关系数据库。
  • MQ Light 帮助您开发响应式、可扩展且在在云中有一个完全托管的消息提供程序的应用程序。
正文到此结束
Loading...