Author: pzf
Date: Tue Aug 7 09:09:05 2007
New Revision: 563541
URL: http://svn.apache.org/viewvc?view=rev&rev=563541
Log:
added SimpleQuartz startup, factory, synapse Job Interface and a simple
MessageInjector job
Added:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/MessageInjector.java
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartz.java
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzFactory.java
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzJob.java
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzSerializer.java
Added:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/MessageInjector.java
URL:
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/MessageInjector.java?view=auto&rev=563541
==============================================================================
---
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/MessageInjector.java
(added)
+++
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/jobs/MessageInjector.java
Tue Aug 7 09:09:05 2007
@@ -0,0 +1,61 @@
+package org.apache.synapse.startup.jobs;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.ManagedLifecycle;
+import org.apache.synapse.MessageContext;
+import org.apache.synapse.core.SynapseEnvironment;
+import org.apache.synapse.startup.Job;
+import org.apache.synapse.util.PayloadHelper;
+
+public class MessageInjector implements Job, ManagedLifecycle {
+ private Log log = LogFactory.getLog(MessageInjector.class);
+
+ private OMElement message;
+
+ String to;
+
+ private SynapseEnvironment synapseEnvironment;
+
+ public void setMessage(OMElement el) {
+ log.debug("set message " + el.toString());
+ message = el;
+ }
+
+ public void setTo(String url) {
+ to = url;
+ }
+
+ public void execute() {
+ log.debug("execute");
+ if (synapseEnvironment == null) {
+ log.error("Synapse Environment not set");
+ return;
+ }
+ if (message == null) {
+ log.error("message not set");
+ return;
+
+ }
+ if (to == null) {
+ log.error("to address not set");
+ return;
+
+ }
+ MessageContext mc = synapseEnvironment.createMessageContext();
+ mc.setTo(new EndpointReference(to));
+ PayloadHelper.setXMLPayload(mc, message.cloneOMElement());
+ synapseEnvironment.injectMessage(mc);
+
+ }
+
+ public void destroy() {
+ }
+
+ public void init(SynapseEnvironment se) {
+ synapseEnvironment = se;
+ }
+
+}
Added:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartz.java
URL:
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartz.java?view=auto&rev=563541
==============================================================================
---
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartz.java
(added)
+++
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartz.java
Tue Aug 7 09:09:05 2007
@@ -0,0 +1,153 @@
+package org.apache.synapse.startup.quartz;
+
+import java.util.HashSet;
+import java.util.Random;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.core.SynapseEnvironment;
+import org.apache.synapse.Startup;
+import org.apache.synapse.SynapseException;
+import org.quartz.CronTrigger;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.Trigger;
+import org.quartz.TriggerUtils;
+import org.quartz.impl.DirectSchedulerFactory;
+
+/*
+ * This class is instantiated by SimpleQuartzFactory (or by hand)
+ * When it is initialized it creates a Quartz Scheduler with a job and a
trigger
+ * The class it starts is always an instance of SimpleQuartzJob
+ * SimpleQuartzJob is there to set the properties and start the actual
business-logic class
+ * It wraps up any properties that the job needs as in the JobDetail and JDMap
+ */
+public class SimpleQuartz implements Startup {
+ private static final Log log = LogFactory.getLog(SimpleQuartz.class);
+ private static final int THREADPOOLSIZE = 5;
+
+ private String cron;
+
+ private int repeatCount;
+
+ private long repeatInterval;
+
+ private boolean simple; // true means use repeat, false means use cron
+
+ private String className;
+
+// private SynapseEnvironment synapseEnvironment;
+
+ private Scheduler sch;
+
+ Set xmlProperties = new HashSet();
+
+ public QName getTagQName() {
+ return SimpleQuartzFactory.JOB;
+ }
+
+ public void destroy() {
+ if (sch != null) {
+ try {
+ sch.shutdown();
+ } catch (SchedulerException e) {
+ throw new SynapseException(e);
+ }
+ }
+
+ }
+
+ public void init(SynapseEnvironment synapseEnvironment) {
+
+ //this.synapseEnvironment = synapseEnvironment;
+ try {
+
DirectSchedulerFactory.getInstance().createVolatileScheduler(
+ THREADPOOLSIZE);
+ sch =
DirectSchedulerFactory.getInstance().getScheduler();
+ Trigger trigger = null;
+ if (simple) {
+
+ trigger =
TriggerUtils.makeImmediateTrigger(repeatCount, repeatInterval);
+ } else {
+ CronTrigger cronTrig = new CronTrigger();
+ cronTrig.setCronExpression(cron);
+ trigger = cronTrig;
+ }
+ // give the trigger a random name
+ trigger.setName("Trigger"+String.valueOf((new
Random()).nextLong()));
+ trigger.setGroup("synapse.simple.quartz");
+ trigger.setVolatility(true);
+ JobDetail jobDetail = new JobDetail();
+ // Give the job a random name
+ jobDetail.setName("Job"+String.valueOf((new
Random()).nextLong()));
+ jobDetail.setGroup("synapse.simple.quartz");
+ jobDetail.setJobClass(SimpleQuartzJob.class);
+ JobDataMap jdm = new JobDataMap();
+ jdm.put(SimpleQuartzJob.SYNAPSEENVIRONMENT,
synapseEnvironment);
+ jdm.put(SimpleQuartzJob.CLASSNAME, className);
+ jdm.put(SimpleQuartzJob.PROPERTIES, xmlProperties);
+ jobDetail.setJobDataMap(jdm);
+ sch.scheduleJob(jobDetail, trigger);
+ sch.start();
+ log.info("Scheduled job "+jobDetail.getFullName()+" for
class "+className);
+
+ } catch (Exception e) {
+ throw new SynapseException("Problem with startup of
Scheduler ", e);
+ }
+
+ }
+
+ public String getJobClass() {
+ return className;
+ }
+
+ public void setJobClass(String attributeValue) {
+ className = attributeValue;
+
+ }
+
+ public void setSimple(boolean b) {
+ simple = b;
+ }
+
+ public boolean isSimple() {
+ return simple;
+ }
+
+ public void setInterval(long l) {
+ repeatInterval = l;
+
+ }
+ public long getInterval() {
+ return repeatInterval;
+ }
+
+ public void setCount(int i) {
+ repeatCount = i;
+ }
+ public int getCount() {
+ return repeatCount;
+ }
+
+ public void addProperty(OMElement prop) {
+ xmlProperties.add(prop);
+ }
+ public Set getProperties() {
+ return xmlProperties;
+ }
+
+ public void setCron(String attributeValue) {
+ cron = attributeValue;
+
+ }
+ public String getCron() {
+ return cron;
+ }
+
+}
Added:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzFactory.java
URL:
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzFactory.java?view=auto&rev=563541
==============================================================================
---
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzFactory.java
(added)
+++
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzFactory.java
Tue Aug 7 09:09:05 2007
@@ -0,0 +1,167 @@
+package org.apache.synapse.startup.quartz;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.config.xml.Constants;
+import org.apache.synapse.config.xml.PropertyHelper;
+import org.apache.synapse.config.xml.StartupFactory;
+import org.apache.synapse.Startup;
+import org.apache.synapse.SynapseException;
+
+/*
+ * Namespace = synapse namespace
+ *
+ * <job class="org.my.synapse.job">
+ * <property name="stringProp" value="String"/>
+ * <property name="xmlProp">
+ * %lt;somexml>config</somexml>
+ * </property>
+ * <simpletrigger forever="true" count="10" interval="1000"/>
+ * <!-- forever or count not both -->
+ * <crontrigger expression="0 * 1 * * ?" />
+ * </job>
+ *
+ */
+
+public class SimpleQuartzFactory implements StartupFactory {
+ public final static QName JOB = new QName(Constants.SYNAPSE_NAMESPACE,
+ "job");
+
+ private final static QName SIMPLE = new
QName(Constants.SYNAPSE_NAMESPACE,
+ "simpletrigger");
+
+ private final static QName CRON = new QName(Constants.SYNAPSE_NAMESPACE,
+ "crontrigger");
+
+ private final static QName PROPERTY = new QName(
+ Constants.SYNAPSE_NAMESPACE, "property");
+
+ private final static Log log =
LogFactory.getLog(SimpleQuartzFactory.class);
+
+ public Startup createStartup(OMElement el) {
+ if (log.isDebugEnabled())
+ log.debug("Creating SimpleQuartz startup");
+ if (el.getQName().equals(JOB)) {
+ SimpleQuartz q = new SimpleQuartz();
+ OMAttribute classAttr = el.getAttribute(new
QName("class"));
+ if (classAttr == null) {
+ log.error("No class attribute on element. It is
required");
+ throw new SynapseException(
+ "Cannot create Quartz Startup -
no class attribute");
+ }
+ // test if we can create the job?
+ String classname =classAttr.getAttributeValue();
+
+ // if no package specified then prepend
"org.apache.synapse.startup.jobs"
+ if (classname.indexOf('.')==-1) {
+ classname =
"org.apache.synapse.startup.jobs."+classname;
+ }
+ try {
+
getClass().getClassLoader().loadClass(classname).newInstance();
+ }
+ catch (Exception e) {
+ throw new SynapseException("Failed to load job
class "+ classname, e);
+ }
+ q.setJobClass(classname);
+ // next sort out the property children
+
+ Iterator it = el.getChildrenWithName(PROPERTY);
+ while (it.hasNext()) {
+ // simply store the properties for now - they
will be loaded when the job is actually run
+ OMElement prop = (OMElement) it.next();
+ if (PropertyHelper.isStaticProperty(prop)) {
+ q.addProperty(prop);
+
+ } else {
+ throw new SynapseException(
+ "job does not support
dynamic properties");
+ }
+ }
+
+ /* try to handle the simpletrigger approach */
+ OMElement trigger = el.getFirstChildWithName(SIMPLE);
+ if (trigger != null) {
+ q.setSimple(true);
+ OMAttribute repeatInterval =
trigger.getAttribute(new QName(
+ "interval"));
+ if (repeatInterval == null) {
+ log.error("interval attribute must be
specified");
+ throw new SynapseException(
+ "No interval attribute
specified");
+ }
+ try {
+
q.setInterval(Long.parseLong(repeatInterval
+ .getAttributeValue()));
+ } catch (Exception e) {
+ throw new SynapseException(
+ "Failed to parse
interval as long");
+ }
+ OMAttribute count = trigger.getAttribute(new
QName("count"));
+ if (count == null) {
+ // if no count set then forever must be
set and set to true
+ OMAttribute forever =
trigger.getAttribute(new QName(
+ "forever"));
+
+ if (forever != null) {
+ String fValue =
forever.getAttributeValue();
+ if
(fValue.toLowerCase().charAt(0) == 't'
+ ||
fValue.toLowerCase().charAt(0) == '1') {
+ q.setCount(-1);
+ } else {
+ throw new
SynapseException(
+ "count
must be set or forever='true'");
+ }
+ } else {
+ throw new SynapseException(
+ "count must be
set or forever='true'");
+ }
+ } // else count is set
+ else {
+ try {
+
q.setCount(Integer.parseInt(count.getAttributeValue()));
+ } catch (Exception e) {
+ throw new SynapseException(
+ "Failed to
parse count as integer");
+ }
+ }
+
+ } else // should be cron trigger
+ {
+ trigger = el.getFirstChildWithName(CRON);
+ if (trigger == null ) {
+ log.error("neither cron nor
simpletrigger are set");
+ throw new SynapseException("neither
crontrigger nor simpletrigger child elements exist");
+ }
+ q.setSimple(false); // cron trigger
+ OMAttribute expr = trigger.getAttribute(new
QName("expression"));
+ if (expr==null){
+ log.error("crontrigger element must
have expression attribute");
+ throw new SynapseException("crontrigger
element must have expression attribute");
+ }
+ q.setCron(expr.getAttributeValue());
+ }
+
+ return q;
+ } else {
+ log.error("wrong QName!");
+ return null;
+ }
+
+ }
+
+ public Class getSerializerClass() {
+ return SimpleQuartzSerializer.class;
+ }
+
+ public QName getTagQName() {
+
+ return JOB;
+ }
+
+}
Added:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzJob.java
URL:
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzJob.java?view=auto&rev=563541
==============================================================================
---
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzJob.java
(added)
+++
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzJob.java
Tue Aug 7 09:09:05 2007
@@ -0,0 +1,50 @@
+package org.apache.synapse.startup.quartz;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.ManagedLifecycle;
+import org.apache.synapse.config.xml.PropertyHelper;
+import org.apache.synapse.core.SynapseEnvironment;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+public class SimpleQuartzJob implements Job{
+ public static final String SYNAPSEENVIRONMENT= "SynapseEnvironment",
CLASSNAME="ClassName", PROPERTIES = "Properties";
+ private static final Log log = LogFactory.getLog(SimpleQuartzJob.class);
+ public void execute(JobExecutionContext ctx) throws
JobExecutionException {
+ log.debug("executing job "+ctx.getJobDetail().getFullName());
+ JobDataMap jdm = ctx.getMergedJobDataMap();
+ String jobClassName = (String)jdm.get(CLASSNAME);
+ if (jobClassName==null) {
+ throw new JobExecutionException("No "+CLASSNAME+" in
JobDetails");
+ }
+ org.apache.synapse.startup.Job job =null;
+ try {
+ job =
(org.apache.synapse.startup.Job)getClass().getClassLoader().loadClass(jobClassName).newInstance();
+ } catch (Exception e) {
+ throw new JobExecutionException("Cannot instantiate job
"+jobClassName, e);
+ }
+ Set properties = (Set)jdm.get(PROPERTIES);
+ Iterator it = properties.iterator();
+ while (it.hasNext()) {
+ OMElement prop = (OMElement)it.next();
+ log.debug("found Property"+prop.toString());
+ PropertyHelper.setStaticProperty(prop, job);
+ }
+ SynapseEnvironment se =
(SynapseEnvironment)jdm.get("SynapseEnvironment");
+ if (job instanceof ManagedLifecycle) {
+ if (se!=null) {
+ ((ManagedLifecycle)job).init(se);
+ }
+ }
+ job.execute();
+
+ }
+
+}
Added:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzSerializer.java
URL:
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzSerializer.java?view=auto&rev=563541
==============================================================================
---
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzSerializer.java
(added)
+++
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/startup/quartz/SimpleQuartzSerializer.java
Tue Aug 7 09:09:05 2007
@@ -0,0 +1,44 @@
+package org.apache.synapse.startup.quartz;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
+import org.apache.synapse.config.xml.Constants;
+import org.apache.synapse.config.xml.StartupSerializer;
+import org.apache.synapse.Startup;
+import org.apache.synapse.SynapseException;
+
+public class SimpleQuartzSerializer implements StartupSerializer {
+
+ public void serializeStartup(OMElement parent, Startup s) {
+ if (!(s instanceof SimpleQuartz)) throw new
SynapseException("called SimpleQuartzSerializer on some other kind of
startup"+s.getClass().getName());
+ SimpleQuartz sq = (SimpleQuartz)s;
+ OMFactory fac = parent.getOMFactory();
+ OMNamespace nullNS = fac.createOMNamespace("", "");
+ OMElement job = fac.createOMElement(SimpleQuartzFactory.JOB,
parent);
+ job.addAttribute("class", sq.getJobClass(), nullNS);
+ if (sq.isSimple()) {
+ OMElement el = fac.createOMElement(new
QName(Constants.SYNAPSE_NAMESPACE,"simpletrigger"), job);
+ if (sq.getCount()==-1) {
+ el.addAttribute("forever","true",nullNS);
+ } else {
+
el.addAttribute("count",Integer.toString(sq.getCount()),nullNS);
+ }
+ el.addAttribute("interval",
Long.toString(sq.getInterval()), nullNS);
+ } else {
+ OMElement el = fac.createOMElement(new
QName(Constants.SYNAPSE_NAMESPACE,"crontrigger"), job);
+ el.addAttribute("expression", sq.getCron(), nullNS);
+ }
+ Iterator it = sq.getProperties().iterator();
+ while (it.hasNext()) {
+ OMElement prop = (OMElement)it.next();
+ job.addChild(prop.cloneOMElement());
+ }
+
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]