Про то, как настроить JBoss на выполнение программы в заданное время

В этой заметке рассказывается как быстро заставить программу выполняться в заданное время на сервере приложений JBoss. Пример состоит из небольшого приложения, задача которого — скачивать курсы валют с сервера в формате XML и обновлять локальную таблицу в базе данных MySQL. Статья включает в себя фрагменты исходного кода. Тестовые примеры доступны для скачивания.

Окружение

Итак, задача довольно проста и понятна. Если Вы хотите запустить пример, то вам необходимо иметь базу данных MySQL и сервер приложений JBoss. В моем распоряжении имеется JBoss 4.2.1 GA Порт по умолчанию 8080. База данных MySQL 6.0.2. Java, которая установлена на моем компьютере, имеет номер 6.0.3.

База данных

Начнем с создания базы данных примера. Назовем ее schedule и сразу создадим табличку sheduler_table с полями id — по привычке, currency — код валют. Он не бывает более 3 символов, value — значение котировки валют и last_update — в этом поле будет автоматически проставлена дата последнего обновления таблицы.

 CREATE TABLE schedule_table 
 (
  id integer (11) NOT NULL AUTO_INCREMENT , 
  currency varchar (27), 
  value float (10,5), 
  last_update timestamp NOT NULL,
  PRIMARY KEY (id)
 ) TYPE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

Пишем код

Далее я просто создал Java проект в Eclipse. Я все делал в Eclipse — мне так удобно. Но сборка архива для публикации в JBoss будет происходить при помощи простого Ant сценария. Давайте сразу посмотрим, как будет выглядеть конечный ear файл:

  • schedule-test.ear.ear
    • META-INF
      • application.xml
      • jboss-app.xml
      • schedule-service.xml
    • schedule-ejb.jar
      • META-INF
        • MANIFEST.MF
      • schedule
        • ejb
          • ApplicationWorker.class
    • schedule.war
      • META-INF
        • MANIFEST.MF
      • WEB-INF
        • web.xml

Класс schedule.ejb.CurrencyUpdater является самым главным в этом приложении. Но прежде чем начать его рассматривать надо скопировать три библиотеки в папку lib в корень проекта: 2 из jboss/server/default/lib/scheduler-plugin.jar и jboss/server/default/lib/servlet-api.jar и одну из другого места — mysql-connector-java-5.0.8-bin.jar (если у Вас нет такого места, можно найти ее тут: http://dev.mysql.com/downloads/connector/j/5.1.html). Просто подключите их к проекту Eclipse(Project/properties/Java Buidl Path/Libraries/Add JARs…). Эти библиотеки понадобятся только тестирования и заполнения базы данных в первый раз.

Итак. Метод parseURL открывает URL с XML файлом котировок валют и заполняет HashMap cMap. Следующий метод — insertCurrencyTable() всего лишь заполняет значениями таблицу schedule_table. В реальном приложении Connection берется из другого места при помощи dependency injection. Здесь все проще — соединение получаем тут же из метода getMySQLConnection().

 private void parseURL(String url) throws IOException, SAXException
 {

  DOMParser parser = new DOMParser();
  parser.parse(url);
  Element element = parser.getDocument().getDocumentElement();
  NodeList pages = element.getElementsByTagName("Day");
  for (int i = 0, maxCount = pages.getLength(); i < maxCount; i++)
  {
   Element e = (Element)pages.item(i);
   cMap.put(e.getAttribute("currency"), 
   Float.valueOf(e.getAttribute("rate")));
  }
 }

 private void insertCurrencyTable() throws SQLException, OException, SAXException{

  parseURL("currency.xml");
  Connection conn = getMySQLConnection();
  PreparedStatement psInsertCurrency = conn.prepareStatement("insert into schedule_table set currency=?,value=?");
  for(String s : cMap.keySet()){
   psInsertCurrency.setString(1, s);
   psInsertCurrency.setFloat(2, cMap.get(s));
   psInsertCurrency.executeUpdate();
   psInsertCurrency.clearParameters();
  }
  psInsertCurrency.close();
  conn.close();
 }

 private Connection getMySQLConnection(){
  try {
   Class.forName("com.mysql.jdbc.Driver");
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
  String url = "jdbc:mysql://localhost:3306/schedule";
  Connection con = null;
  try {
   con = (Connection) DriverManager.getConnection(url, "root","");
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return con;
 }	

Убедимся в том, что файл с тестовыми котировками лежит в корне проекта — currency.xml. Запустим CurrencyUpdater, для того чтобы убедиться в его работоспособности. Из метода main должен запуститься insertCurrencyTable()и заполнить таблицу данными из файла currency.xml. После того как это произошло, нам осталось только собрать архив и сказать серверу приложений JBoss, чтобы он запускал программу через определенные промежутки времени.

Страница:

  • 1

  • 2