You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2009/12/06 01:59:47 UTC
svn commit: r887623 - in /openejb/trunk/openejb3:
container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/
container/openejb-core/src/test/java/org/apache/openejb/core/mdb/ examples/
examples/quartz-app/ examples/quartz-app/quartz-beans...
Author: dblevins
Date: Sun Dec 6 00:59:45 2009
New Revision: 887623
URL: http://svn.apache.org/viewvc?rev=887623&view=rev
Log:
OPENEJB-1115: Quartz Resource Adapter
Added:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java (with props)
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java (with props)
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java
- copied, changed from r880936, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java
openejb/trunk/openejb3/examples/quartz-app/
openejb/trunk/openejb3/examples/quartz-app/pom.xml (with props)
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml (with props)
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java (with props)
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml (with props)
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/
openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java (with props)
openejb/trunk/openejb3/examples/quartz-app/quartz-ra/
openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml (with props)
openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/
openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/
openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/
openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/
openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml (with props)
Modified:
openejb/trunk/openejb3/examples/pom.xml
Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java Sun Dec 6 00:59:45 2009
@@ -0,0 +1,269 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.resource.quartz;
+
+import org.quartz.CronTrigger;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+
+import javax.resource.spi.ActivationSpec;
+import javax.resource.spi.ResourceAdapter;
+import javax.resource.spi.InvalidPropertyException;
+import javax.resource.spi.endpoint.MessageEndpoint;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+import java.util.Date;
+
+/**
+ * @version $Rev$ $Date$
+*/
+public class JobSpec implements ActivationSpec {
+
+ private MessageEndpoint endpoint;
+ private ResourceAdapter resourceAdapter;
+ private final CronTrigger trigger;
+ private final JobDetail detail;
+ private InvalidPropertyException invalidProperty;
+
+ public JobSpec() {
+ int i = hashCode();
+
+ detail = new JobDetail();
+ trigger = new CronTrigger();
+
+ detail.setJobClass(QuartzResourceAdapter.JobEndpoint.class);
+ detail.getJobDataMap().setAllowsTransientData(true);
+
+ setVolatile(true);
+
+ setJobGroup(Scheduler.DEFAULT_GROUP);
+ setJobName("Job" + i);
+
+ setTriggerGroup(Scheduler.DEFAULT_GROUP);
+ setTriggerName("Trigger" + i);
+ }
+
+ public String getTriggerName() {
+ return trigger.getName();
+ }
+
+ public void setTriggerName(String s) {
+ trigger.setName(s);
+ }
+
+ public String getTriggerGroup() {
+ return trigger.getGroup();
+ }
+
+ public void setTriggerGroup(String s) {
+ trigger.setGroup(s);
+ }
+
+ // -- Job Name
+
+ public String getJobName() {
+ return detail.getName();
+ }
+
+ public void setJobName(String s) {
+ detail.setName(s);
+ trigger.setJobName(s);
+ }
+
+ // -- Job Group
+
+ public void setJobGroup(String s) {
+ detail.setGroup(s);
+ trigger.setJobGroup(s);
+ }
+
+ public String getJobGroup() {
+ return trigger.getJobGroup();
+ }
+
+ // -- Description
+
+ public String getDescription() {
+ return trigger.getDescription();
+ }
+
+ public void setDescription(String s) {
+ detail.setDescription(s);
+ trigger.setDescription(s);
+ }
+
+ // -- Volatility
+
+ public void setVolatile(boolean b) {
+ detail.setVolatility(b);
+ trigger.setVolatility(b);
+ }
+
+ public boolean isVolatile() {
+ return trigger.isVolatile();
+ }
+
+ // -- Recoverable
+
+ public void setRequestsRecovery(boolean b) {
+ detail.setRequestsRecovery(b);
+ }
+
+ public boolean isRequestsRecovery() {
+ return detail.requestsRecovery();
+ }
+
+ // -- Durability
+
+ public boolean isDurable() {
+ return detail.isDurable();
+ }
+
+ public void setDurable(boolean b) {
+ detail.setDurability(b);
+ }
+
+ // -- Calendar name
+
+ public void setCalendarName(String s) {
+ trigger.setCalendarName(s);
+ }
+
+ public String getCalendarName() {
+ return trigger.getCalendarName();
+ }
+
+ // -- Expression
+
+ public void setCronExpression(String s) {
+ try {
+ trigger.setCronExpression(s);
+ } catch (ParseException e) {
+ invalidProperty = new InvalidPropertyException("Invalid cron expression " + s, e);
+ }
+ }
+
+ public String getCronExpression() {
+ return trigger.getCronExpression();
+ }
+
+ /**
+ * An alias for CronExpression
+ *
+ * @param s
+ */
+ public void setCronTrigger(String s) {
+ setCronExpression(s);
+ }
+
+ // --
+
+ public void setTimeZone(String timeZone) {
+ trigger.setTimeZone(TimeZone.getTimeZone(timeZone));
+ }
+
+ // --
+
+ public void setStartTime(String startTime) {
+ Date date = parse(startTime);
+ if (date != null) {
+ trigger.setStartTime(date);
+ }
+ }
+
+ public void setEndTime(String endTime) {
+ Date date = parse(endTime);
+ if (date != null) {
+ trigger.setEndTime(date);
+ }
+ }
+
+
+ private Date parse(String value) {
+
+ String[] formats = {
+ "EEE MMM d HH:mm:ss z yyyy",
+ "EEE, d MMM yyyy HH:mm:ss Z",
+ "yyyy-MM-dd HH:mm:ss.S",
+ "yyyy-MM-dd HH:mm:ss.SZ",
+ "yyyy-MM-dd HH:mm:ss.S",
+ "yyyy-MM-dd HH:mm:ssZ",
+ "yyyy-MM-dd HH:mm:ss",
+ "yyyy-MM-dd HH:mmZ",
+ "yyyy-MM-dd HH:mm",
+ "yyyy-MM-dd'T'HH:mm:ss.SZ",
+ "yyyy-MM-dd'T'HH:mm:ss.S",
+ "yyyy-MM-dd'T'HH:mm:ssZ",
+ "yyyy-MM-dd'T'HH:mm:ss",
+ "yyyy-MM-dd'T'HH:mmZ",
+ "yyyy-MM-dd'T'HH:mm",
+ "yyyy-MM-dd",
+ "yyyyMMdd"
+ };
+
+ for (String format : formats) {
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+ try {
+ return dateFormat.parse(value);
+ } catch (ParseException e) {
+ invalidProperty = new InvalidPropertyException("Invalid time format " + value, e);
+ }
+
+ }
+
+ return null;
+ }
+
+ // -- ActivationSpec methods
+
+ public void validate() throws InvalidPropertyException {
+ if (invalidProperty != null) throw invalidProperty;
+
+ try {
+ detail.validate();
+ trigger.validate();
+ } catch (SchedulerException e) {
+ throw new InvalidPropertyException(e);
+ }
+ }
+
+ public ResourceAdapter getResourceAdapter() {
+ return resourceAdapter;
+ }
+
+ public void setResourceAdapter(ResourceAdapter resourceAdapter) {
+ this.resourceAdapter = resourceAdapter;
+ }
+
+ MessageEndpoint getEndpoint() {
+ return endpoint;
+ }
+
+ void setEndpoint(MessageEndpoint endpoint) {
+ this.endpoint = endpoint;
+ }
+
+ CronTrigger getTrigger() {
+ return trigger;
+ }
+
+ JobDetail getDetail() {
+ return detail;
+ }
+}
Propchange: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/JobSpec.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java Sun Dec 6 00:59:45 2009
@@ -0,0 +1,142 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.openejb.resource.quartz;
+
+import org.quartz.Scheduler;
+import org.quartz.SchedulerFactory;
+import org.quartz.SchedulerException;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.quartz.impl.StdSchedulerFactory;
+
+import javax.resource.spi.BootstrapContext;
+import javax.resource.spi.ResourceAdapterInternalException;
+import javax.resource.spi.ActivationSpec;
+import javax.resource.spi.endpoint.MessageEndpointFactory;
+import javax.resource.spi.endpoint.MessageEndpoint;
+import javax.resource.ResourceException;
+import javax.transaction.xa.XAResource;
+import java.lang.reflect.Method;
+
+/**
+ * @version $Rev$ $Date$
+*/
+public class QuartzResourceAdapter implements javax.resource.spi.ResourceAdapter {
+
+ private Scheduler scheduler;
+
+ public void start(BootstrapContext bootstrapContext) throws ResourceAdapterInternalException {
+ try {
+ SchedulerFactory factory = new StdSchedulerFactory();
+ scheduler = factory.getScheduler();
+ scheduler.start();
+ } catch (SchedulerException e) {
+ throw new ResourceAdapterInternalException("Failed to create Quartz Scheduler", e);
+ }
+ }
+
+ public void stop() {
+ try {
+ scheduler.shutdown(true);
+ } catch (SchedulerException e) {
+ throw new IllegalStateException("Failed to shutdown Quartz Scheduler", e);
+ }
+ }
+
+ public void endpointActivation(MessageEndpointFactory messageEndpointFactory, ActivationSpec activationSpec) throws ResourceException {
+ JobSpec spec = (JobSpec) activationSpec;
+
+ MessageEndpoint endpoint = messageEndpointFactory.createEndpoint(null);
+ spec.setEndpoint(endpoint);
+
+ Job job = (Job) endpoint;
+
+ JobDataMap jobDataMap = spec.getDetail().getJobDataMap();
+ jobDataMap.setAllowsTransientData(true);
+ jobDataMap.put(Data.class.getName(), new Data(job));
+
+ try {
+ scheduler.scheduleJob(spec.getDetail(), spec.getTrigger());
+ } catch (SchedulerException e) {
+ throw new ResourceException("Failed to schedule job", e);
+ }
+ }
+
+ public void endpointDeactivation(MessageEndpointFactory messageEndpointFactory, ActivationSpec activationSpec) {
+ JobSpec spec = (JobSpec) activationSpec;
+
+ try {
+ scheduler.deleteJob(spec.getJobName(), spec.getJobGroup());
+ } catch (SchedulerException e) {
+ throw new IllegalStateException("Failed to delete job", e);
+ }
+
+ spec.getEndpoint().release();
+ }
+
+
+ public static class JobEndpoint implements Job {
+
+ public void execute(JobExecutionContext execution) throws JobExecutionException {
+
+ JobDataMap jobDataMap = execution.getJobDetail().getJobDataMap();
+
+ Data data = Data.class.cast(jobDataMap.get(Data.class.getName()));
+
+ Job job = data.job;
+
+ MessageEndpoint endpoint = (MessageEndpoint) job;
+
+ try {
+ Method method = Job.class.getMethod("execute", JobExecutionContext.class);
+
+ endpoint.beforeDelivery(method);
+
+ job.execute(execution);
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException(e);
+ } catch (ResourceException e) {
+ throw new JobExecutionException(e);
+ } finally {
+ try {
+ endpoint.afterDelivery();
+ } catch (ResourceException e) {
+ throw new JobExecutionException(e);
+ }
+ }
+ }
+ }
+
+ /**
+ * A private inner class is used so the key and value are not publicly visible.
+ * This is standard OpenEJB practice for all "public storage" maps as it prevents
+ * outside code from becoming dependent on or tampering with the private data.
+ */
+ private static class Data {
+ private final Job job;
+
+ private Data(Job job) {
+ this.job = job;
+ }
+ }
+
+ public XAResource[] getXAResources(ActivationSpec[] activationSpecs) throws ResourceException {
+ return new XAResource[0];
+ }
+}
Propchange: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/quartz/QuartzResourceAdapter.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java (from r880936, openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java?p2=openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java&p1=openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java&r1=880936&r2=887623&rev=887623&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java Sun Dec 6 00:59:45 2009
@@ -35,9 +35,13 @@
import org.apache.openejb.jee.MessageAdapter;
import org.apache.openejb.jee.MessageListener;
import org.apache.openejb.util.Join;
+import org.apache.openejb.resource.quartz.QuartzResourceAdapter;
+import org.apache.openejb.resource.quartz.JobSpec;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
import javax.naming.InitialContext;
-import javax.jms.ConnectionFactory;
import javax.annotation.Resource;
import javax.annotation.PostConstruct;
import javax.ejb.MessageDrivenContext;
@@ -60,11 +64,13 @@
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
/**
* @version $Rev$ $Date$
*/
-public class CustomMdbContainerTest extends TestCase {
+public class QuartzMdbContainerTest extends TestCase {
public void test() throws Exception {
System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, InitContextFactory.class.getName());
@@ -76,38 +82,30 @@
// Setup the descriptor information
- EmailBean.lifecycle.clear();
+ CronBean.lifecycle.clear();
AppModule app = new AppModule(this.getClass().getClassLoader(), "testapp");
- Connector connector = new Connector("email-ra");
- ResourceAdapter adapter = connector.setResourceAdapter(new ResourceAdapter(EmailResourceAdapter.class));
+ Connector connector = new Connector("quartz");
+ ResourceAdapter adapter = connector.setResourceAdapter(new ResourceAdapter(QuartzResourceAdapter.class));
InboundResource inbound = adapter.setInboundResourceAdapter(new InboundResource());
MessageAdapter messageAdapter = inbound.setMessageAdapter(new MessageAdapter());
- MessageListener listener = messageAdapter.addMessageListener(new MessageListener(EmailConsumer.class, EmailAccountInfo.class));
- listener.getActivationSpec().addRequiredConfigProperty("address");
+ MessageListener listener = messageAdapter.addMessageListener(new MessageListener(Job.class, JobSpec.class));
+ listener.getActivationSpec().addRequiredConfigProperty("cronExpression");
app.getResourceModules().add(new ConnectorModule(connector));
EjbJar ejbJar = new EjbJar();
- ejbJar.addEnterpriseBean(new MessageDrivenBean(EmailBean.class));
+ ejbJar.addEnterpriseBean(new MessageDrivenBean(CronBean.class));
app.getEjbModules().add(new EjbModule(ejbJar));
AppInfo appInfo = config.configureApplication(app);
assembler.createApplication(appInfo);
- InitialContext initialContext = new InitialContext();
- EmailResourceAdapter ra = (EmailResourceAdapter) initialContext.lookup("java:openejb/Resource/email-raRA");
+ assertTrue(CronBean.latch.await(5, TimeUnit.SECONDS));
- Properties headers = new Properties();
- headers.put("To", "dblevins@apache.org");
- headers.put("From", "dblevins@visi.com");
- headers.put("Subject", "Hello");
-
- ra.deliverEmail(headers, "How's it going?");
-
- Stack<Lifecycle> lifecycle = EmailBean.lifecycle;
+ Stack<Lifecycle> lifecycle = CronBean.lifecycle;
List expected = Arrays.asList(Lifecycle.values());
@@ -119,15 +117,14 @@
CONSTRUCTOR, INJECTION, POST_CONSTRUCT, ON_MESSAGE
}
- @MessageDriven(activationConfig = {@ActivationConfigProperty(propertyName = "address", propertyValue = "dblevins@apache.org")})
- public static class EmailBean implements EmailConsumer {
+ @MessageDriven(activationConfig = {@ActivationConfigProperty(propertyName = "cronExpression", propertyValue = "* * * * * ?" )})
+ public static class CronBean implements Job {
- public static Lock lock = new ReentrantLock();
- public static Condition messageRecieved = lock.newCondition();
+ public static CountDownLatch latch = new CountDownLatch(1);
private static Stack<Lifecycle> lifecycle = new Stack<Lifecycle>();
- public EmailBean() {
+ public CronBean() {
lifecycle.push(Lifecycle.CONSTRUCTOR);
}
@@ -141,83 +138,9 @@
lifecycle.push(Lifecycle.POST_CONSTRUCT);
}
- public void receiveEmail(Properties headers, String body) {
+ public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
lifecycle.push(Lifecycle.ON_MESSAGE);
+ latch.countDown();
}
}
-
- public static interface EmailConsumer {
- public void receiveEmail(Properties headers, String body);
- }
-
- public static class EmailResourceAdapter implements javax.resource.spi.ResourceAdapter {
- public boolean started;
-
- private final Map<String, EmailConsumer> consumers = new HashMap<String, EmailConsumer>();
-
- public void start(BootstrapContext bootstrapContext) throws ResourceAdapterInternalException {
- }
-
- public void stop() {
- }
-
- public void endpointActivation(MessageEndpointFactory messageEndpointFactory, ActivationSpec activationSpec) throws ResourceException {
- EmailAccountInfo accountInfo = (EmailAccountInfo) activationSpec;
-
- EmailConsumer emailConsumer = (EmailConsumer) messageEndpointFactory.createEndpoint(null);
- consumers.put(accountInfo.getAddress(), emailConsumer);
- }
-
- public void endpointDeactivation(MessageEndpointFactory messageEndpointFactory, ActivationSpec activationSpec) {
- EmailAccountInfo accountInfo = (EmailAccountInfo) activationSpec;
-
- EmailConsumer emailConsumer = consumers.remove(accountInfo.getAddress());
- MessageEndpoint endpoint = (MessageEndpoint) emailConsumer;
- endpoint.release();
- }
-
- public XAResource[] getXAResources(ActivationSpec[] activationSpecs) throws ResourceException {
- return new XAResource[0];
- }
-
- public void deliverEmail(Properties headers, String body) throws Exception {
- String to = headers.getProperty("To");
-
- EmailConsumer emailConsumer = consumers.get(to);
-
- if (emailConsumer == null) throw new Exception("No such account");
-
- MessageEndpoint endpoint = (MessageEndpoint) emailConsumer;
-
- endpoint.beforeDelivery(EmailConsumer.class.getMethod("receiveEmail", Properties.class, String.class));
- emailConsumer.receiveEmail(headers, body);
- endpoint.afterDelivery();
- }
- }
-
- public static class EmailAccountInfo implements ActivationSpec {
- private EmailResourceAdapter emailResourceAdapter;
-
- private String address;
-
- public void validate() throws InvalidPropertyException {
- }
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-
- public EmailResourceAdapter getResourceAdapter() {
- return emailResourceAdapter;
- }
-
- public void setResourceAdapter(javax.resource.spi.ResourceAdapter resourceAdapter) {
- this.emailResourceAdapter = (EmailResourceAdapter) resourceAdapter;
- }
- }
-
-}
+}
\ No newline at end of file
Modified: openejb/trunk/openejb3/examples/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/pom.xml?rev=887623&r1=887622&r2=887623&view=diff
==============================================================================
--- openejb/trunk/openejb3/examples/pom.xml (original)
+++ openejb/trunk/openejb3/examples/pom.xml Sun Dec 6 00:59:45 2009
@@ -59,6 +59,7 @@
<module>jpa-eclipselink</module>
<module>spring-integration</module>
<module>telephone-stateful</module>
+ <module>quartz-app</module>
<module>webservice-attachments</module>
<module>webapps</module>
<module>webservice-security</module>
Added: openejb/trunk/openejb3/examples/quartz-app/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/pom.xml?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/pom.xml (added)
+++ openejb/trunk/openejb3/examples/quartz-app/pom.xml Sun Dec 6 00:59:45 2009
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.superbiz.quartz</groupId>
+ <artifactId>quartz-app</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <packaging>pom</packaging>
+ <name>Quartz App</name>
+
+ <modules>
+ <module>quartz-ra</module>
+ <module>quartz-beans</module>
+ </modules>
+
+ <repositories>
+ <repository>
+ <id>apache-m2-snapshot</id>
+ <name>Apache Snapshot Repository</name>
+ <url>http://people.apache.org/repo/m2-snapshot-repository/</url>
+ </repository>
+ </repositories>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>quartz</groupId>
+ <artifactId>quartz</artifactId>
+ <version>1.5.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>openejb-core</artifactId>
+ <version>3.1.3-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.0.2</version>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+</project>
Propchange: openejb/trunk/openejb3/examples/quartz-app/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml Sun Dec 6 00:59:45 2009
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.superbiz.quartz</groupId>
+ <artifactId>quartz-app</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>quartz-beans</artifactId>
+ <packaging>jar</packaging>
+ <name>Quartz Beans</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.superbiz.quartz</groupId>
+ <artifactId>quartz-ra</artifactId>
+ <version>${pom.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>quartz</groupId>
+ <artifactId>quartz</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.4</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.15</version>
+ <exclusions>
+ <exclusion>
+ <groupId>com.sun.jdmk</groupId>
+ <artifactId>jmxtools</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>com.sun.jmx</groupId>
+ <artifactId>jmxri</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>javax.jms</groupId>
+ <artifactId>jms</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>javaee-api</artifactId>
+ <version>5.0-1</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>openejb-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+</project>
\ No newline at end of file
Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java Sun Dec 6 00:59:45 2009
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.superbiz.quartz;
+
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.apache.log4j.Logger;
+
+import javax.ejb.ActivationConfigProperty;
+import javax.ejb.MessageDriven;
+
+@MessageDriven(activationConfig = {@ActivationConfigProperty(propertyName = "cronExpression", propertyValue = "* * * * * ?")})
+public class QuartzMdb implements Job {
+
+ private Logger logger = Logger.getLogger(getClass());
+
+ public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+ System.out.println("Executing Job");
+ }
+}
Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/java/org/superbiz/quartz/QuartzMdb.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml Sun Dec 6 00:59:45 2009
@@ -0,0 +1 @@
+<ejb-jar/>
\ No newline at end of file
Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/main/resources/META-INF/ejb-jar.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java Sun Dec 6 00:59:45 2009
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.superbiz.quartz;
+
+import junit.framework.TestCase;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.util.Properties;
+
+public class QuartzMdbTest extends TestCase {
+
+ public void test() throws Exception {
+
+ Properties properties = new Properties();
+ properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
+
+ InitialContext initialContext = new InitialContext(properties);
+
+ // Sleep five seconds and give quartz a chance to execute our MDB
+ Thread.sleep(5000);
+ }
+
+
+}
Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-beans/src/test/java/org/superbiz/quartz/QuartzMdbTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml Sun Dec 6 00:59:45 2009
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.superbiz.quartz</groupId>
+ <artifactId>quartz-app</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>quartz-ra</artifactId>
+ <packaging>jar</packaging>
+ <name>Quartz Resource Adapter</name>
+
+ <description>
+ Maven doesn't allow rar files in the test classpath for some reason,
+ so we have to pull this trick to get it in the classpath.
+ </description>
+
+ <dependencies>
+ <dependency>
+ <groupId>quartz</groupId>
+ <artifactId>quartz</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
+ <artifactId>openejb-core</artifactId>
+ </dependency>
+ </dependencies>
+
+</project>
\ No newline at end of file
Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-ra/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml?rev=887623&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml (added)
+++ openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml Sun Dec 6 00:59:45 2009
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<connector xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+ http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"
+ version="1.5">
+
+ <description>Quartz ResourceAdapter</description>
+ <display-name>Quartz ResourceAdapter</display-name>
+
+ <vendor-name>Apache.org</vendor-name>
+ <eis-type>Quartz Adapter</eis-type>
+ <resourceadapter-version>1.0</resourceadapter-version>
+
+ <resourceadapter>
+ <resourceadapter-class>org.apache.openejb.resource.quartz.QuartzResourceAdapter</resourceadapter-class>
+
+ <inbound-resourceadapter>
+ <messageadapter>
+ <messagelistener>
+ <messagelistener-type>org.quartz.Job</messagelistener-type>
+ <activationspec>
+ <activationspec-class>org.apache.openejb.resource.quartz.JobSpec</activationspec-class>
+ </activationspec>
+ </messagelistener>
+ </messageadapter>
+ </inbound-resourceadapter>
+
+ </resourceadapter>
+</connector>
Propchange: openejb/trunk/openejb3/examples/quartz-app/quartz-ra/src/main/resources/META-INF/ra.xml
------------------------------------------------------------------------------
svn:eol-style = native