如何在JBossESB上创建一个非常简单的cron作业

如何在JBossESB上创建一个非常简单的cron作业,cron,jboss-esb,Cron,Jboss Esb,我正在寻找一种最简单的方法来安排一个简单的作业——一个不与任何其他ESB组件交互的作业。[这是我在ESB土地上的第一个小时,对我放松点。] 我知道有一个cron调度程序producer。如果您熟悉cron,它看起来非常简单: <providers> <schedule-provider name="schedule"> <cron-schedule scheduleid="cron-trigger" cronExpression="0/1 * * * *

我正在寻找一种最简单的方法来安排一个简单的作业——一个不与任何其他ESB组件交互的作业。[这是我在ESB土地上的第一个小时,对我放松点。]

我知道有一个
cron调度程序
producer。如果您熟悉
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> 

考虑到我的工作行动不会发送任何消息,也不需要通知任何关于成功或失败的信息。我是否可以简单地扩展和重写该方法,并在那里实现我的作业执行,而不创建操作

即使这是可能的,为这个简单的模式使用一个动作会有什么好处吗


我正在使用JBoss ESB 4.9。

我加入了自己的几乎为空的
ScheduledEventMessageComposer
,并让我的工作扩展了
AbstractActionLifecycle

jbossesb.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.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();
            }
        }
    }

}

我加入了自己的几乎为空的
ScheduledEventMessageComposer
,并让我的工作扩展了
AbstractActionLifecycle

jbossesb.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.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();
            }
        }
    }

}

另一种方法是实现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>

因此,当您部署它时,它将导致onSchedule()每分钟运行一次。

另一种方法是实现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>

因此,当您部署它时,它将导致onSchedule()每分钟运行一次。

1k+视图,而且没有一次投票!有徽章吗?祝福所有投票的人,但我不会接受任何慈善。如果我知道该问谁,我会要求撤回,因为我很难相信ESB精灵。记住,只有当这个问题在现实生活中有用时,才进行投票。1k+视图,没有一次投票!有徽章吗?祝福所有投票的人,但我不会接受任何慈善。如果我知道该问谁,我会要求撤回,因为我很难相信ESB精灵。记住,只有当这个问题在现实生活中有用时,才进行投票。