Статьи

Создание тасклетов и рабочих мест с помощью Soafaces

Soafaces — это инфраструктура для построения высокомодульных серверных компонентов, называемых тасклетами, которые можно запускать в контейнере обработки заданий. С помощью soafaces вы можете создавать внутренние задания и службы, работающие на основе рабочего процесса, которые можно планировать и запускать на внутреннем сервере с легким доступом к веб-службам и которые можно настраивать с помощью веб-интерфейса настройщика GWT.

Это арктика проходит через процесс создания очень простого компонента soafaces (называемого Bundle). Bundle реализует тасклет, а также включает графический интерфейс Weblet для настройки входных свойств тасклета JavaBean. Затем вы можете взять этот комплект и запустить его как автономный серверный модуль / компонент и объединить его с другими комплектами, чтобы сформировать задание, и запустить его в механизме планирования, таком как JobServer. JobServer — это механизм планирования, который использует soafaces в качестве своего плагина API для создания и выполнения заданий.

Выполните следующие действия, чтобы узнать, как разработать, упаковать и развернуть свой собственный пакет SOAFaces (Bundle):

  1. Реализация интерфейса тасклета
  2. Реализация интерфейса Weblet (необязательно)
  3. Определите входной JavaBean для тасклета (необязательно)
  4. Определите выходной JavaBean для тасклета (необязательно)
  5. Создать файл MANIFEST.MF
  6. Содержимое пакета в JAR-файл Bundle
  7. Разверните новый Bundle в контейнере SOAFaces (например, JobServer)

Шаг 1. Реализация интерфейса тасклета
Используя интерфейс тасклета, реализуйте интерфейс org.soafces.bundle.workflow.Tasklet, реализовав метод onExecute. Вот простой пример:

public class HelloWorld implements Tasklet 
{
public HelloWorld()
{
super();
}

/**
* The outBean is null in this example because there is no
* output JavaBean defined.
*
*/
public void onExecute(SOATaskInputContext inputContext, SOATaskOutputContext outputContext)
{
//If your Tasklet uses an input and/or output JavaBean then it is
//best to get them and cast to the appropriate class type.
HelloWorldInput inputBean = (HelloWorldInput) inputContext.getInputBean();

/**
* Create and name a logger in order to log all messages. The name
* can be anything you like. These logs messages can be viewed
* using the JobServer Tracker tool which privides a history of
* all Taskelets and Jobs that have run.
*
* JobServer captures all Log4J and Java Logging API messages
* made by the Tasklet and makes them available for viewing from
* the Job Tracker tool. Note that Log4J Logger must support
* additivity=true for logs to be captured and reported by Job Tracker.
*/
Logger myLogger = Logger.getLogger("myLogger");
myLogger.log(Level.INFO, "Hello " + inputBean.getPersonName());

return;
}
}

Метод onExecute будет вызываться, когда вышеуказанный тасклет запускается как часть задания.

Шаг 2. Реализация интерфейса Weblet (необязательно).
Этот шаг является необязательным при создании тасклетов. Графический интерфейс Weblet будет использоваться для настройки входного JavaBean, который используется в качестве входных данных для тасклета, когда задание запускается на стороне сервера. Вот как может выглядеть реализация Weblet:

public class HelloWorldCustomizer extends SimplePOJOWeblet
{
private TextBox _oNameField = new TextBox();
private HelloWorldInput _oMyInputBean = null;

/**
*/
public HelloWorldCustomizer() {}

protected void populateMainPanelPOJO(IsSerializable inputBean)
{
_oMyInputBean = (HelloWorldInput) inputBean;

VerticalPanel vSpacer = null;

getMainPanel().add(new Label("Simple hello world example. Constructs a simple " +
"hello world message and logs it using Java " +
"Logging API when the Tasklet is run in a Job"));
vSpacer = new VerticalPanel(); vSpacer.setHeight("20");
getMainPanel().add(vSpacer);

getMainPanel().add(new Label("(Enter your name to put into hello world message)"));
vSpacer = new VerticalPanel(); vSpacer.setHeight("2");
getMainPanel().add(vSpacer);
getMainPanel().add(new Label("Name: "));
getMainPanel().add(_oNameField);
vSpacer = new VerticalPanel(); vSpacer.setHeight("20");
getMainPanel().add(vSpacer);

//Initialize the field to the value in the input JavaBean
_oNameField.setText(_oMyInputBean.getPersonName());
}

/**
* This method should be used to save the state
* of the GUI to the input JavaBean and perform
* any necessary validation checks. If the validation
* is not proper it should return false.
*
* The Container hosting the Weblet will call
* this method in order to save the input JavaBean
* to its persistent store. The saved state of the
* input JavaBean is what is referenced when the
* Tasklet/Job is run.
*/
public void onSaveInputBean(SuccessFailCallback callback)
{
try {
//Save the changes made by the user/gui to the input JavaBean
//person name
if(_oNameField.getText() == null || _oNameField.getText().trim().equals(""))
{
Window.alert("Error: No name specified");

callback.returnFailure();
return;
}
else
{
_oMyInputBean.setPersonName(_oNameField.getText());
}

callback.returnSuccess();
}catch(Throwable ex) {
callback.returnFailure();
}
}
}

Шаг 3. Определите входной JavaBean для тасклета (необязательно)
. Входной JavaBean может быть отредактирован с помощью графического интерфейса Weblet и использован в качестве ввода для тасклета при запуске задания. Пример будет такой:

/**
* Note that an Input JavaBean must implement IsSerializable to be used
* by GWT clients.
*/
public class HelloWorldInput implements IsSerializable
{
private String personName="";

public HelloWorldInput()
{
super();
}

/**
* Name of person to put in the Hello world sentence.
*/
public void setPersonName(String value)
{
personName=value;
}

public String getPersonName()
{
return personName;
}
}

Шаг 4. Определение выходного JavaBean для тасклета (необязательно)
Выходной JavaBean используется тасклетом в качестве выходного. Когда тасклет запускается как часть задания, интерфейс тасклета может записывать все соответствующие выходные данные в этот JavaBean. Пример вывода JavaBean будет выглядеть так:

/**
* Note that an Output JavaBean must implement IsSerializable to be used
* by GWT clients.
*/

public class HelloWorldOutput implements IsSerializable
{
private String personName="";

public HelloWorldInput()
{
super();
}

/**
* Name of person to put in the Hello world sentence.
*/
public void setPersonName(String value)
{
personName=value;
}

public String getPersonName()
{
return personName;
}
}

Шаг 5. Создание файла MANIFEST.MF Файл
MANIFEST.MF содержит метаинформацию, которая сообщает контейнеру SOAFaces, например, JobServer, что содержится в файле JAR Bundle и какие интерфейсы определены в Bundle. Файл помещается в каталог META-INF внутри Bundle JAR.

SOAFaces-Name: Hello World 3
SOAFaces-SymbolicName: surda-beansoup-helloworld3
SOAFaces-Version: 1.0.0
SOAFaces-Description: Simple Tasklet with an input JavaBean and MFace Customizer
SOAFaces-Vendor: Grand Logic, Inc
SOAFaces-Category: example
#Tasklet run on the server-side when java/task is run
SOAFaces-Tasklet: org.beansoup.helloworld3.workflow.HelloWorld
#Optional input JavaBean used by the Weblet and Tasklet
SOAFaces-InputBean: org.beansoup.helloworld3.client.HelloWorldInput
#GWT client Module name
SOAFaces-Weblet: org.beansoup.helloworld3.HelloModuleName

Шаг 6: Упакуйте содержимое в JAR-файл Bundle
Весь код и содержимое упакованы и помещены в JAR-файл Bundle с расширением .sfb. Вот пример структуры каталогов файла JAR.

META-INF/MANIFEST.MF
classes/org/beansoup/helloworld3/client/
HelloWorldCustomizer.java
HelloWorldCustomzier.class
HelloWorldInput.java
HelloWorldInput.class

classes/org/beansoup/helloworld3/workflow/
HelloWorld.class

lib/
someThirdPartyGWT-Client.jar
someThirdPartyServer-Side.jar

Вот пример простой цели ANT, которая может создать архивный файл Bundle:

    <target name="build_sfb" depends="compile" description="Build Bundle for example Tasklet">
<mkdir dir="build/sfb-dir/org-beansoup-helloworld3-v1-0-0/classes" />
<copy todir="build/sfb-dir/org-beansoup-helloworld3-v1-0-0/classes"
overwrite="false">
<fileset dir="${build.classes.dir}"
includes="org/beansoup/helloworld3/**/*.class"/>

<!-- include source for GWT client code -->
<fileset dir="${src.dir}"
includes="org/beansoup/helloworld3/*.xml
org/beansoup/helloworld3/client/*.java
org/beansoup/helloworld3/public/*.css"/>
</copy>

<jar destfile="build/sfb-dir/org-beansoup-helloworld3-v1-0-0.sfb"
basedir="build/sfb-dir/org-beansoup-helloworld3-v1-0-0"
includes="**">

<manifest>
<attribute name="SOAFaces-Name" value="Hello World 3"/>
<attribute name="SOAFaces-SymbolicName" value="surda-beansoup-helloworld3"/>
<attribute name="SOAFaces-Version" value="1.0.0"/>
<attribute name="SOAFaces-Description" value="Simple Tasklet with an input JavaBean and Weblet customizer"/>
<attribute name="SOAFaces-Vendor" value="Grand Logic, Inc"/>
<attribute name="SOAFaces-Category" value="example"/>
<attribute name="SOAFaces-Tasklet" value="org.beansoup.helloworld3.workflow.HelloWorld"/>
<attribute name="SOAFaces-InputBean" value="org.beansoup.helloworld3.client.HelloWorldInput"/>
<attribute name="SOAFaces-OutputBean" value="org.beansoup.helloworld3.client.HelloWorldOutput"/>
<attribute name="SOAFaces-Weblet" value="org.beansoup.helloworld3.client.HelloWorldCustomizer"/>
<attribute name="SOAFaces-InputViewer" value=""/> <!-- Optional GUI viewer for viewing input of Tasklet -->
<attribute name="SOAFaces-OutputViewer" value=""/> <!-- Optional GUI viewer for viewing output of Tasklet -->
</manifest>
</jar>
</target>

Обратите внимание, что код GWT клиента требует, чтобы источник также был включен в файл JAR. Компилятору GWT требуется исходный код, и он будет использовать его для компиляции на лету Weblet в код GWT AJAX. Каталог lib может содержать любые необходимые сторонние JAR-файлы, используемые кодом Weblet или Tasklet.

Обратите внимание, что у вас есть возможность включить клиентский код GWT (исходный код java и скомпилированный код) в Bundle и позволить контейнеру SOAFaces скомпилировать клиентский код GWT в javascript для вас (освобождает разработчика от работы с компилятором GWT), или вы можете Скомпилируйте клиентский код GWT самостоятельно (используя компилятор GWT) и напрямую включите JavaScript в Bundle. Вы просто включаете скомпилированный код клиента GWT в каталог www в банке Bundle.

 

Шаг 7. Разверните новый Bundle в контейнере SOAFaces (например, JobServer).
Назовите JAR-файл Bundle, например myhelloworld.sfb, и поместите его в каталог JobServer soafaces. Имя должно быть уникальным в JobServer. Теперь перейдите к инструменту репозитория JobServer SOAFaces, и вы должны увидеть новый комплект. Теперь он может быть использован для создания новой работы!

Для получения дополнительной информации о Soafaces и построении / выполнении заданий и тасклетов в механизме планирования обратитесь к: