Как сделать чрезвычайно простую работу cron на JBoss ESB - PullRequest
1 голос
/ 25 февраля 2011

Я ищу простейшую вещь, которая могла бы работать для планирования простой работы - работу, которая не взаимодействует ни с каким другим компонентом ESB.[ Полегче на меня, так как это мой первый час в ESB-стране. ]

Я получаю немного информации о наличии cron-scheduler продюсера.Это кажется очень простым, если вы знакомы с cron:

<providers>
  <schedule-provider name="schedule">
    <cron-schedule scheduleid="cron-trigger" cronExpression="0/1 * * * * ?" />
  </schedule-provider>
</providers>

Далее идет слушатель (ссылающийся на производителя) для обработки запланированных событий

<services>
    <service category="ServiceCat" name="ServiceName" description="Test Service">
        <listeners>
            <scheduled-listener name="cron-schedule-listener" 
                                scheduleidref="cron-trigger"
                                event-processor="org.example.MyListener" />
        </listeners>
    </service>
</services> 

Учитываячто мое рабочее задание не будет отправлять какие-либо сообщения или что-то будет необходимо уведомлять об успехе или неудаче.Могу ли я просто расширить ScheduleListener и переопределить метод onSchedule() и реализовать выполнение моей работы там без создания действия?

Даже если бы это было возможно, будет лиесть ли польза от использования действия для этого простого шаблона?

Я использую JBoss ESB 4.9.

Ответы [ 2 ]

2 голосов
/ 28 июля 2012

Еще один способ сделать это - реализовать класс org.jboss.soa.esb.schedule.ScheduledEventListener.

Таким образом, ваш jboss-esb.xml будет выглядеть так:

<?xml version="1.0"?>
<jbossesb parameterReloadSecs="5" xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd http://anonsvn.jboss.org/repos/labs/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd">
 <providers>
  <schedule-provider name="myDaemonProvider">
   <cron-schedule cronExpression="0 */1 * * * ?" scheduleid="my-daemon-trigger"/>
  </schedule-provider>
 </providers>
 <services>
  <service category="Cron" description="My Cron Daemon" name="MyDaemon">
   <listeners>
    <scheduled-listener event-processor="com.myCompany.esb.myDaemon.main.MyDaemonScheduledEventListener" name="my-daemon-listener"  scheduleidref="my-daemon-trigger"/>
   </listeners>
  </service>
 </services>
</jbossesb>

И тогда ваш com.myCompany.esb.myDaemon.main.MyDaemonScheduledEventListener будет выглядеть так:

package com.myCompany.esb.myDaemon.main;

import org.jboss.soa.esb.ConfigurationException;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.schedule.ScheduledEventListener;
import org.jboss.soa.esb.schedule.SchedulingException;

public class MyDaemonScheduledEventListener implements ScheduledEventListener {

    public void initialize(ConfigTree arg0) throws ConfigurationException {
        System.out.println("Initializing the Cron Daemon...");
    }

    public void uninitialize() {
        System.out.println("Uninitializing the Cron Daemon...");
    }

    public void onSchedule() throws SchedulingException {
        System.out.println("Scheduled Execution!");
    }
}

Поэтому, когда вы развернете это, он будет запускать onSchedule () каждую минуту.

2 голосов
/ 02 марта 2011

Я набрал и добавил свой почти пустой ScheduledEventMessageComposer и продлил работу AbstractActionLifecycle

jboss-esb.xml:

<?xml version="1.0"?>
<jbossesb parameterReloadSecs="300"
 xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd">
 <providers>
  <schedule-provider name="schedule">
  <!-- fire every hour -->
   <cron-schedule cronExpression="0 1 * * * ?" scheduleid="cron-trigger"/>
  </schedule-provider>
 </providers>
 <services>
  <service category="dummy" description="create dummy message" name="dummy-message">
   <listeners>
    <scheduled-listener event-processor="org.example.ActionMsgComposer"
     name="cron-schedule-listener" scheduleidref="cron-trigger"/>
   </listeners>
   <actions mep="OneWay">
    <action class="org.example.CronAction" name="action" process="execute"/>
   </actions>
  </service>
 </services>
</jbossesb> 

org.example.ActionMsgComposer:

package org.example;

import org.jboss.soa.esb.ConfigurationException;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.listeners.ScheduledEventMessageComposer;
import org.jboss.soa.esb.message.Message;
import org.jboss.soa.esb.message.format.MessageFactory;
import org.jboss.soa.esb.message.format.MessageType;
import org.jboss.soa.esb.schedule.SchedulingException;

public class ActionMsgComposer implements ScheduledEventMessageComposer {

    public void initialize(ConfigTree config) throws ConfigurationException {
    }

    public void uninitialize() {
    }

    public Message composeMessage() throws SchedulingException {
        Message myMessage = MessageFactory.getInstance().getMessage(MessageType.JBOSS_XML);
        myMessage.getBody().add("dummy");
        return myMessage;
    }

    public Message onProcessingComplete(Message message)
            throws SchedulingException {
        return message;
    }

}

org.example.CronAction:

package org.example;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collection;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Pattern;

import org.jboss.soa.esb.actions.AbstractActionLifecycle;
import org.jboss.soa.esb.actions.ActionLifecycleException;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.message.Message;

public class CronAction extends AbstractActionLifecycle {

    private ConfigTree configTree;
    private boolean initialized = false;
    private final Lock initLock = new ReentrantLock(true);
    private final Condition initCondition = initLock.newCondition();

    public CronAction(ConfigTree config) {
        configTree = config;
    }

    public ConfigTree getConfigTree() {
        return configTree;
    }

    @Override
    public void initialise() throws ActionLifecycleException {
        try {
            initLock.lock();
            super.initialise();
            // ** do any one-time initialization for cron job here **
            initialized = true;
            initCondition.signalAll();
        } finally {
            initLock.unlock();
        }
    }

    public Message exec(Message message) {
        waitUntilInitialized();
        // ** do cron job here ** 
        return message;
    }

    @Override
    public void destroy() throws ActionLifecycleException {
        super.destroy();
        // ** do any clean-up for cron job here **
    }

    private void waitUntilInitialized() {
        if (!initialized) {
            try {
                initLock.lock();
                while (!initialized) {
                    initCondition.await();
                }
            } catch (InterruptedException e) {
                // ignore
            } finally {
                initLock.unlock();
            }
        }
    }

}
...