注册使用 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 上。
运行应用程序
获取代码
在 DevOps Services 项目 MigrateJ2EE 中,您将找到两个 Eclipse 项目:Training(一个可部署在任何应用程序服务器中的传统 J2EE 应用程序)和 BlueTraining(一个应部署在 Bluemix 中的移植的应用程序)。以下步骤涉及 BlueTraining。
MyTrainingApp
并单击 Create 。现在,您的应用程序 MyTrainingApp 和 SendGrid 服务已绑定。 C:/bluemix> cf login -a https://api.ng.bluemix.net [Enter your Bluemix credentials here.] C:/bluemix> cf push MyTrainingApp -p BlueTraining.war
备注:“MyTrainingApp” 是应用程序的名称。
Training
作为您的应用程序的上下文根。 备注:配置这些表时,需要确保使用用户名作为模式名称,这是 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 凭据。
使用 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);
在传统 J2EE 应用程序中,我们为 JMS 使用了 Default Messaging Provider。我们创建了一个服务集成总线 (JMSBus)、队列连接工厂 (jms/TrainingQCF) 和一个队列 (jms/TrainingQueue)。用户订阅一次培训时,该应用程序会在队列中放入一条消息(参见 JMSSender.java
类了解在队列中放入和获取消息的详细信息)。
以用户身份登录到应用程序,单击 Subscribe for Training 获得有关您感兴趣的培训的电子邮件通知。输入该培训并单击 Subscribe 。
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 所需的最精简的代码。
在传统 J2EE 应用程序中,我们使用了 JavaMail API 来向订阅培训的用户发送电子邮件。只要管理员添加了一个培训,该应用程序就会检查订阅表,以查看是否有用户请求了该培训。如果存在一个订阅,将向该用户发送一封电子邮件。
在 IBM Bluemix 中,我们将尝试利用 SendGrid 所提供的新电子邮件功能。客户端可利用 SendGrid 的成熟交付基础架构,将一个基于云的简单电子邮件引擎集成到其 Web 和移动应用程序中。因为该应用程序绑定了 SendGrid 服务,所以它可使用 SendGrid API 发送电子邮件。
现在,在 Training 应用程序中,以管理员身份登录(电子邮件:admin@in.ibm.com)。单击 Add new Training 并添加培训 Bluemix
。
该应用程序检查订阅表,发现用户 < your_userid > 已请求培训 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: