понедельник, 13 января 2014 г.

SoapUI: подстановка вычисляемых значений с помощью вставок на Groovy

Целей функционального тестирования композитных приложений иногда используются заглушки и/или SoapUI,EM и прочие средства. Но как правило необходимо отправлять сообщения с отличающимися данными, например: документ на согласование с различными идентификатором и текущей датой отправки. Можно каждый раз перед отправкой менять значения вручную, но удобнее например для числовых идентификаторов использовать случайное число из определённого диапазона, а для даты подставлять например текущую дату. В SoapUI есть поддержка Groovy и подобное поведение делается очень легко (выделено красным):
Итак, в качестве значения поля для генерации:
  • числового значения в диапазоне от 0 до 10000 нужно подставить:
     ${=(int)(Math.random()*10000)}  
    
  • текущей даты нужно подставить:
     ${=new Date().format(‘yyyy-MM-dd’)}  
    

понедельник, 6 января 2014 г.

Планировщик заданий в Weblogic Server

Реализовать планировщик заданий можно, как средствами встроенных в операционную систему(ОС) планировщиков заданий так и встроенных СУБД, но при изменении ОС (например, с Windows на AIX) либо изменении СУБД (например, с Oracle на MySQL) потребуется переработка компонента планировщика. Рассмотрим реализацию планировщика заданий работающего внутри Weblogic Server, который не зависит от ОС и СУБД.
Данный планировщик представляет собой простейшее Web-приложение и будет выполнять задачу через каждые 5 секунд, а задача при выполнении будет писать в лог строку с временем выполнения (никто не запрещает сделать более сложную логику). А так же будет создан сервлет для управления заданием (действия - остановить выполнение и запустить выполнение). Более того при создании не будут использоваться внешние библиотеки, только те которые есть в Weblogic Server.
  1. Открываем Oracle JDeveloper и создаём новое приложение (с именем SampleScheduler):
  2. Затем добавляем в проект необходимые библиотеки.
  3. Создаём новый класс для описания задания(с именем HelloWorldJob):
     package com.blogspot.stan1slav.sample.jobs;  
       
     import commonj.timers.CancelTimerListener;  
     import commonj.timers.Timer;  
     import commonj.timers.TimerListener;  
       
     import java.io.Serializable;  
       
     import java.util.Date;  
       
     public class HelloWorldJob implements Serializable, TimerListener,  
                        CancelTimerListener {  
       private Date timerDate = null;  
       
       public HelloWorldJob() {  
         super();  
       }  
       
       public void timerExpired(Timer timer) {  
         timerDate = new Date(timer.getScheduledExecutionTime());  
         System.out.println("HelloWorldJob timer expired called on " +  
                   timerDate);  
       }  
       
       public void timerCancel(Timer timer) {  
         timerDate = new Date(timer.getScheduledExecutionTime());  
         System.out.println("HelloWorldJob timer cancelled called on " +  
                   timerDate);  
       }  
     }  
    
    Следует обратить внимание на выделенное красным, это те классы которые должны быть имплементированы и методы которые должны быть реализованы (один при срабатывании задачи и другой для отмены/остановки задачи). Инициализацию задания можно вынести в конструктор.
  4. Создаём сервлет для старта/остановки задания, а так же автозапуска:
     package com.blogspot.stan1slav.sample;  
       
     import com.blogspot.stan1slav.sample.jobs.HelloWorldJob;  
       
     import commonj.timers.Timer;  
     import commonj.timers.TimerManager;  
       
     import java.io.IOException;  
     import java.io.PrintWriter;  
       
     import java.util.Date;  
       
     import javax.naming.InitialContext;  
       
     import javax.servlet.ServletConfig;  
     import javax.servlet.ServletException;  
     import javax.servlet.http.HttpServlet;  
     import javax.servlet.http.HttpServletRequest;  
     import javax.servlet.http.HttpServletResponse;  
       
     public class JobsServlet extends HttpServlet {  
       private Timer helloWorldJobTimer = null;  
       private TimerManager tm = null;  
       
       public void init(ServletConfig config) throws ServletException {  
         super.init(config);  
         System.out.println("InitJobsServlet is initialized ");  
       
         try {  
           InitialContext ic = new InitialContext();  
           tm = (TimerManager)ic.lookup("java:comp/env/tm/TimerManager");  
           helloWorldJobTimer =  
               tm.schedule(new HelloWorldJob(), new Date(), 5000); //5 seconds  
         } catch (Exception ne) {  
           ne.printStackTrace();  
         }  
       }  
       
       public void service(HttpServletRequest req,  
                 HttpServletResponse res) throws IOException {  
         res.setContentType("text/html");  
         PrintWriter out = res.getWriter();  
         out.println("<h4>JobsServlet is working!</h4>");  
         String cmd = req.getParameter("cmd");  
         if (cmd != null && cmd.equals("cancel") && helloWorldJobTimer != null) {  
           helloWorldJobTimer.cancel();  
           helloWorldJobTimer = null;  
         }  
         if (cmd != null && cmd.equals("start") && helloWorldJobTimer == null) {  
           helloWorldJobTimer =  
               tm.schedule(new HelloWorldJob(), new Date(), 5000);  
         }  
         if (helloWorldJobTimer != null) {  
           out.println("<h6>HelloWorldJob started</h6>");  
         } else {  
           out.println("<h6>HelloWorldJob calceled</h6>");  
         }  
       }  
     }  
    
  5. В web.xml прописать ссылку на ресурс (т.е. на наш TimerManager):
     <?xml version = '1.0' encoding = 'UTF-8'?>  
     <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
          version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">  
      <servlet>  
       <servlet-name>JobsServlet</servlet-name>  
       <servlet-class>com.blogspot.stan1slav.sample.JobsServlet</servlet-class>  
       <load-on-startup>100</load-on-startup>  
      </servlet>  
      <servlet-mapping>  
       <servlet-name>JobsServlet</servlet-name>  
       <url-pattern>/jobsservlet</url-pattern>  
      </servlet-mapping>  
      <resource-ref>  
       <res-ref-name>tm/TimerManager</res-ref-name>  
       <res-type>commonj.timers.TimerManager</res-type>  
       <res-auth>Container</res-auth>  
       <res-sharing-scope>Unshareable</res-sharing-scope>  
      </resource-ref>
     </web-app>  
    
  6. Деплоим на сервер (как WAR-архив) и проверяем работоспособность (смотрим в out-лог сервера)
    1. Задание выполняется после деплоя:
    2. С использованием сервлета остановим выполнение задания (для этого при вызове добавляем ?cmd=cancel):
    3. В логе появилась запись об остановке (отмене) задания:
    4. С использованием сервлета стартуем снова задание (для этого при вызове добавляем ?cmd=start):
    5. В логе появились записи о выполнении задания:
Полезная информация:

пятница, 8 ноября 2013 г.

Oracle SOA: управление композитами через WLST

Все команды выполняются из wlst.cmd или wlst.sh находящегося в SOA_HOME, у меня например это:
 C:\Apps\Oracle\Weblogic\10.3.6\Oracle_SOA1\common\bin\wlst.cmd  
  • Просмотр развёрнутых композитов и их статусов:
    wls:/offline> 
     sca_listDeployedComposites('bpm-dev.mycompany.com',
                                '8001',
                                'weblogic',
                                'welcome1') 
    
    где weblogic - логин административного пользователя;
    welcome1 - пароль административного пользователя;
    bpm-dev.mycompany.com - хост SOA-сервера;
    8001 - порт SOA-сервера.

    Пример результата:
     Following 4 composites are currently deployed to the platform:  
     1. AsyncProc[1.0], partition=default, mode=active, state=on, isDefault=true, deployedTime=2013-07-25T11:26:03.309+04:00  
     2. SimpleApproval[1.0], partition=default, mode=active, state=on, isDefault=true, deployedTime=2012-10-17T18:55:11.333+04:00  
     3. SimpleHT[1.0], partition=default, mode=active, state=on, isDefault=true, deployedTime=2012-12-21T13:23:24.345+04:00  
     4. AgreementApproversService[1.0], partition=prod, mode=active, state=on, isDefault=true, deployedTime=2013-02-22T17:51:30.971+04:00  
    
  • Старт композита:
    wls:/offline> 
     sca_startComposite('bpm-dev.mycompany.com',
                        '8001',
                        'weblogic',
                        'welcome1',
                        'AsyncProc',
                        '1.0',
                        partition='default') 
    
    где AsyncProc - имя композита;
    1.0 - версия композита;
    default - раздел.

  • Стоп композита:
    wls:/offline> 
     sca_stopComposite('bpm-dev.mycompany.com',
                       '8001',
                       'weblogic',
                       'welcome1',
                       'AsyncProc',
                       '1.0',
                       partition='default') 
    
  • Активация композита:
    wls:/offline> 
     sca_activateComposite('bpm-dev.mycompany.com',
                           '8001',
                           'weblogic',
                           'welcome1',
                           'AsyncProc',
                           '1.0',
                           partition='default') 
    
  • Деактивация композита:
    wls:/offline> 
     sca_retireComposite('bpm-dev.mycompany.com',
                         '8001',
                         'weblogic',
                         'welcome1',
                         'AsyncProc',
                         '1.0',
                         partition='default') 
    

среда, 6 ноября 2013 г.

Формат полей типа Date в Oracle SQL Developer

Проблема:
При выборке и экспорте (в формате insert) данных формат колонки типа Date:
 15-NOV-11  

Вариант решения:
  1. В SQL Developer перейти в меню "Tools"->"Preferences"
  2. В окне Preferences выбрать "Database"->"NLS" в левой панеле
  3. В списке NLS параметров найти "Date Format" и для него ввести следующее значение
    DD-MM-YYYY HH24:MI:SS
  4. Нажать "OK" и пользоваться.

пятница, 22 марта 2013 г.

Кратко о архитектурной модели "4+1"

Достаточно важную роль в развитии подходов к описанию архитектуры предприятия сыграла модель "4+1" (точнее "The 4+1 View Model of Architecture"), которая была предложена Филиппом Кручтеном (Philippe Kruchten) из компании Rational еще в 1995 году. Данная методика позиционировалась, прежде всего, как способ описания архитектуры систем, основанных на активном использовании программного обеспечения, хотя идеи, заложенные в эту методику, могут использоваться и в более широком контексте архитектуры предприятия – что, собственно, и произошло на практике.
Модель предлагает простой и понятный способ описания архитектуры сложных систем, который состоит в использовании пяти различных категорий или представлений (views). Четырьмя основными представлениями в этой методике являются следующие:
  • Логическое представление. Является объектной моделью проектирования (в том случае, если используется объектно-ориентированная модель проектирования).
  • Процессное представление. Описывает вопросы параллельного исполнения и синхронизации процессов.
  • Физическое представление. Описывает размещение программных компонент системы на аппаратных платформах и аспекты, связанные с физическим расположением системы.
  • Представление уровня разработки. Описывает статическую организацию программной системы в среде разработки.
Описание архитектуры системы на основе этих четырех представлений иллюстрируется и проходит проверку путем использования еще одного представления, которое содержит некоторые отобранные сценарии использования (use cases). Архитектура системы во многом определяется этими сценариями. Каждое представление отражает специфические аспекты моделируемой системы.

Основной целью логического представления в данной методике является описание функциональных требований: что система должна выполнять в терминах конечных пользователей. Для этого представления используются различные абстрактные конструкции, такие как объекты и классы объектов. Для их иллюстрирования могут применяться диаграммы классов (в нотации языка UML) либо, например, диаграммы "сущность-связь", если в разработке приложения доминируют данные.

Процессное представление учитывает некоторые нефункциональные требования (NFR) к системе, включая производительность и доступность. С помощью этого представления рассматриваются такие аспекты, как одновременное выполнение и распределение процессов, интеграция системы, устойчивость к сбоям, а также то, как основные объекты абстракции, рассмотренные на уровне логического представления, соответствуют архитектуре процессов. Архитектура процессов может быть представлена на различных уровнях абстракции. На самом высоком уровне система рассматривается как набор независимо выполняемых сетей взаимодействующих между собой программ. На более низких уровнях рассматриваются процессы и задачи.

Представление уровня разработки описывает фактическую организацию модулей системы, разделение ее на подсистемы, которые могут разрабатываться независимо.

Физическое представление, в основном, рассматривает нефункциональные требования, такие как доступность, надежность, устойчивость, производительность, масштабируемость. Этот уровень описывает распределение различных элементов – сетей, процессов, задач и объектов – по различным узлам (элементам аппаратного обеспечения, объединенным в сеть).

Сценарии объединяют все представления вместе. Сценарии использования описываются как последовательность взаимодействия объектов и процессов. Они отражают наиболее важные требования, которым должна удовлетворять система. Это представление в каком-то смысле является избыточным и пересекается с четырьмя предыдущими, но оно важно по следующим причинам:
  • Сценарии использования позволяют идентифицировать элементы архитектуры, которые требуются для эффективно работающей системы.
  • С помощью сценариев можно выполнять проверку и иллюстрацию того, что архитектура является работоспособной и полной. Это также является основой для проведения тестирования архитектурного прототипа.
Ссылки для более подробного изучения данной модели здесь.

Источник: http://www.intuit.ru/department/itmngt/entarc/9/entarc_9.html