转载

将 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...