Содержание


Перенесите свои веб-приложения в Bluemix

Comments

Большинство корпоративных приложений, построенных за последнее десятилетие, – это традиционные приложения на платформе Java™ 2, Enterprise Edition (J2EE), работающие на сервере приложений. Почти в 90% таких приложений используется база данных и другие функции, такие как Java Message Service (JMS), электронная почта и т.п. В этом руководстве показано, как перенести J2EE-приложение в среду IBM® Bluemix™. В следующих разделах дано описание процесса переноса каждого отдельного компонента с использованием новейших служб, предлагаемых на платформе Bluemix.

Наш пример J2EE-приложения – это простое учебное приложение, которое обеспечивает функции регистрации нового пользователя, входа в систему и просмотра доступных тренингов. Пользователь может подписаться на тренинги, чтобы всякий раз при появлении нового тренинга получать уведомление по электронной почте.

В примере J2EE-приложения, прилагаемом к этому руководству, используются традиционные функции Java Database Connectivity (JDBC), JMS и электронной почты. В этом примере мы использовали базу данных DB2®, а также JMS Default Messaging Provider и API JavaMail для отправки сообщений электронной почты. В Bluemix мы используем базу данных SQL Database, службу MQ Light в качестве JMS и службу электронной почты SendGrid. Веб-приложение работает на сервере Liberty. Это руководство демонстрирует, как легко перенести в Bluemix каждый компонент J2EE.

Что требуется для создания приложения

  • Знакомство с J2EE-программированием
  • Учетная запись Bluemix
  • Eclipse с установленным плагином Bluemix

Запустить приложениеПолучить код

Шаг 1. Загрузка плагина IBM Bluemix для Eclipse

  1. Выберите Help > Eclipse Marketplace.
  2. Выполните поиск по слову «Bluemix».
  3. Выберите IBM Eclipse Tools for Bluemix.
  4. Установите плагин.
  5. На вкладке Server выберите New > Server > IBM > IBM Bluemix.
  6. Введите адрес электронной почты и пароль своей учетной записи Bluemix.
  7. Подтвердите свою учетную запись.

Шаг 2. Импорт проекта в Eclipse

  1. Скопируйте URL-адрес Git (https://hub.jazz.net/git/kmalarvizhi/MigrateJ2EE/) из правой части страницы проекта.
  2. В Eclipse выберите File > Import.
  3. В окне Import выберите Git > Projects from Git и нажмите кнопку Next.
  4. Выберите Clone UR и нажмите кнопку Next.
  5. Вставьте в поле URI скопированный URL Git. В разделе Authentication введите свой идентификатор пользователя Jazz и пароль IBM ID. Нажмите кнопку Next.
  6. Выберите те ветви, с которыми вы хотите работать, и нажмите кнопку Next.
  7. Если нужно, обновите раздел Local Destination клонированного репозитория и нажмите кнопку Next.
  8. Нажмите кнопку Next, а затем кнопку Finish.

Шаг 3. Развертывание приложения

В проекте MigrateJ2EE в DevOps Services вы найдете два проекта 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. Откройте браузер и войдите в Bluemix, набрав URL-адрес (https://ace.ng.bluemix.net).
  10. Нажмите на вкладку CATALOG и выберите службу SendGrid в разделе Web and Application. В открывшемся окне выберите приложение MyTrainingApp и нажмите кнопку Create. Теперь приложение MyTrainingApp и служба SendGrid связаны между собой.
  11. Аналогичным образом свяжите с MyTrainingApp службу MQ Light из раздела Web and Application. Теперь ваше приложение связано со следующими службами: Liberty for Java Runtime, SendGrid service, MQ Light и SQL Database. Перезапустите приложение.
  12. Для сборки проекта и создания файла BlueTraining можно использовать файл build.xml из проекта BlueTraining.war. Разверните файл BlueTraining.war с помощью инструмента командной строки cloud foundry, как показано ниже. Из командной строки выполните следующие команды:
        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. Вы увидите экран, аналогичный показанному ниже. Экран входа в систему
    Экран входа в систему
  15. Если вы – новый пользователь, нажмите кнопку register, чтобы зарегистрироваться. Откроется домашняя страница с двумя ссылками (см. рисунок). Нажмите на ссылку View all Trainings, чтобы получить список тренингов. Домашняя страница
    Домашняя страница

Развертывание приложения на любом сервере приложений

  1. В Eclipse Luna R щелкните правой кнопкой мыши на проекте Training. Выберите пункт меню Export > Web > WAR File. Будет создан файл Training.war. Сохраните его на локальном диске.
  2. Установите war-файл на любом сервере приложений и не забудьте сделать каталог Training корнем контекста своего приложения.
  3. Запустите приложение Training.
  4. Обращайтесь к приложению по адресу: http://hostname:port/training/login.html.

Шаг 4. Перенос базы данных в службу SQLDB в Bluemix

  1. Экспортируйте содержимое таблицы из своего традиционного J2EE-приложения в CSV-файл.
  2. Войдите в Bluemix по адресу http://ace.ng.bluemix.net.
  3. Щелкните на своем учебном приложении: sqldb service.
  4. В разделе Get Started нажмите кнопку Launch. Она запускает консоль, которая позволяет начать работу с базой данных SQL.
  5. Отображается экран приветствия "Welcome to the Managed Database".
  6. Нажмите кнопку Load Data.
  7. Выберите CSV-файл из локальной файловой системы, как показано ниже.
  8. Выберите вариант Load File.
  9. Откроется окно предварительного просмотра таблицы. Нажмите кнопку Next.
  10. На вкладке Choose the target можно загрузить данные в существующую таблицу или создать новую. Мы выбрали вариант create a new table (создать новую таблицу) и загрузили данные. Нажмите кнопку Next.
  11. На вкладке Select a table (Выберите таблицу) посмотрите имя таблицы, измените имена столбцов и проверьте соответствие типов данных и их длины.
  12. Наконец, нажмите кнопку Finish.

Примечание. При настройке таблицы нужно, чтобы имя пользователя совпадало с именем в схеме – значением по умолчанию Bluemix. Его можно найти в учетных данных SQLDB. Кроме того, в таблице должна быть запись с адресом электронной почты admin@in.ibm.com. Она позволяет добавлять в приложение новые тренинги.

Повторите этот процесс для других таблиц (тренингов и подписок). На этом установка базы данных завершена. Мы создали таблицы пользователей, тренингов и подписок.

Следующий шаг – изменить класс служебной базы данных TrainingDB в проекте BlueTraining, чтобы использовать API SQLDB из Bluemix. Измените класс TrainingDB, сформировав URL JDBC из службы SQL Database. Код для извлечения сведений о подключении к службе SQLDB в Bluemix содержится в файле TrainingDB.java. На следующем рисунке показаны учетные данные SQLDB, которые используются для построения URL JDBC.

Ниже приведен код для получения источника данных с помощью базы данных 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. Мы создали Service Integration Bus (JMSBus), Queue Connection factory (jms/TrainingQCF) и Queue (jms/TrainingQueue). Приложение помещает сообщение в очередь, когда пользователь подписывается на тренинг (см. класс JMSSender.java с подробной информацией о постановке сообщения в очередь и его извлечении).

Войдите в приложение в качестве пользователя и нажмите кнопку Subscribe for Training, чтобы получать по электронной почте уведомления об интересующих вас тренингах. Укажите тренинг и нажмите кнопку Subscribe (Подписаться).

Поток JMSScheduler.java запускается каждые три минуты и извлекает сообщения из очереди. Он обрабатывает сообщение и вставляет в таблицу подписок запись с адресом электронной почты абонента и сведениями о тренинге.

MQ Light в Bluemix – это служба, которая предоставляет функцию Java Messaging Service для упрощения асинхронного обмена сообщениями. Благодаря MQ Light нет необходимости создавать службы Messaging Bus, Connection Factory, Queues или Topics и администрировать их на сервере приложений. Класс JMSSender.java, который представляет собой утилиту для получения сообщений и помещения их в очередь JMS, мы изменили так, чтобы он мог использовать API MQ Light.

В своем файле web.xml J2EE определите класс ConnectionFactory, необходимый для помещения сообщений в очередь и их извлечения посредством службы MQ Light.

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

Сначала создайте в своем коде очередь:

             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-приложении мы использовали API JavaMail для отправки пользователям, подписавшимся на тренинги, сообщений по электронной почте. Всякий раз, когда администратор добавляет тренинг, приложение проверяет таблицу подписки, чтобы определить, есть ли пользователь, запросивший такой тренинг. Если подписчик есть, то ему направляется уведомление.

В IBM Bluemix мы попытаемся использовать новые возможности электронной почты, предоставляемые службой SendGrid. Она позволяет интегрировать в свое веб- или мобильное приложение простой механизм электронной почты на основе облака, использующий проверенную инфраструктуру доставки. Приложение, связанное со службой SendGrid, может отправлять сообщения электронной почты с помощью API SendGrid.

Теперь войдите в приложение Training как администратор (admin@in.ibm.com). Нажмите кнопку Add new Training и добавьте тренинг Bluemix.

Приложение проверит таблицу подписки и обнаружит, что тренинг Bluemix заказал пользователь <ваше_имя_пользователя>. Приложение немедленно отправит этому пользователю уведомление. Проверьте свой почтовый ящик, чтобы убедиться, что сообщение было успешно отправлено.

Мы видоизменили утилиту EmailUtil.java, которая отправляет сообщения электронной почты, чтобы она использовала API SendGrid.

Вот пример кода для отправки сообщений электронной почты с помощью 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 на новые службы, предлагаемые в среде Bluemix.

Заключение

Это руководство содержит подробные инструкции по переносу традиционного приложения J2EE в BlueMix с помощью новейших служб. Руководство и пример кода демонстрируют, как перенести в Bluemix приложение, использующее функции базы данных, JMS и электронной почты. В целом эта статья представляет собой краткое практическое руководство по IBM Bluemix, открытой облачной платформе IBM для разработки и развертывания веб- и мобильных приложений.


Ресурсы для скачивания


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Web-архитектура, Облачные вычисления
ArticleID=1011765
ArticleTitle=Перенесите свои веб-приложения в Bluemix
publish-date=07232015