Plain Tomcat + Quartz + Mail work together?
pettersonfp Dec 4, 2007 5:45 PMHello,
I've been trying to send an email inside a method annotated with @Asynchronous in plain tomcat using quartz. The method is called properly and works fine, however, for some reason, the renderer cannot find the facelet template (xhtml).
If I send the email in a normal method it works fine.
After tracing the code I noticed that the problem occurs at the following code returning null:
package org.jboss.seam.util;
...
public class Resources
{
...
public static URL getResource(String resource, ServletContext servletContext)
{
String stripped = resource.startsWith("/") ?
resource.substring(1) : resource;
URL url = null;
if (servletContext!=null)
{
try
{
url = servletContext.getResource(resource);
}
catch (Exception e) {}
}
if (url==null)
{
url = getResource(resource, stripped);
}
return url;
}
...
}
I think that when at tomcat the quartz threads are unable to find the resources but I don't understand why.
Following are the configurations, code and stack trace:
@Name("coollectScheduler")
@AutoCreate
@Install(true)
public class CoollectScheduler extends EntityController {
/**
*
*/
private static final long serialVersionUID = 1633034787217471953L;
private static final String WELCOME_MAIL_TEMPLATE = "/registration/welcome-email.xhtml";
@Asynchronous
@Transactional(TransactionPropagationType.REQUIRED)
public QuartzTriggerHandle scheduleWelcomeEmail(@Expiration
Date when, @IntervalDuration
Long interval, int numberOfRetries, User user) {
try {
user = getEntityManager().find(User.class, user.getId());
Contexts.getEventContext().set("newUser", user);
Contexts.getEventContext().set("numberOfRetries", numberOfRetries);
info("Trying #{newUser.welcomeEmailRetries + 1} of #{numberOfRetries} to send welcome email for the new user: #{newUser.name}");
render(WELCOME_MAIL_TEMPLATE);
user.welcomeEmailSuccessfullySent();
user.getQuartzHandle().cancel();
info("Welcome email was successfully delivered to #{newUser.name} at #{newUser.email}.");
} catch (Exception e) {
e.printStackTrace();
user.incWelcomeEmailRetries();
if (user.getWelcomeEmailRetries() >= numberOfRetries ) {
warn("Welcome email was not delivered to #{newUser.name} at #{newUser.email} and the system will not try again.");
try {
user.getQuartzHandle().cancel();
} catch (SchedulerException swallow) {
error(swallow.getLocalizedMessage());
}
}
else {
warn("Welcome email was not delivered to #{newUser.name} at #{newUser.email} due to: "
+ e.getLocalizedMessage()
+ ", the system will try again automatically.");
}
}
getEntityManager().persist(user);
getEntityManager().flush();
return null;
}
public static CoollectScheduler instance() {
return (CoollectScheduler) Component
.getInstance(CoollectScheduler.class);
}
}
components.xhtml
... <!-- Install the QuartzDispatcher --> <async:quartz-dispatcher/> ...
Stacktrace
java.lang.IllegalArgumentException: resource doesn't exist: /welcome-email.xhtml at org.jboss.seam.ui.facelet.FaceletsRenderer.resourceURL(FaceletsRenderer.java:184) at org.jboss.seam.ui.facelet.FaceletsRenderer$1.process(FaceletsRenderer.java:160) at org.jboss.seam.ui.facelet.FaceletsRenderer$RenderingContext.run(FaceletsRenderer.java:78) at org.jboss.seam.ui.facelet.FaceletsRenderer.render(FaceletsRenderer.java:169) at org.jboss.seam.framework.Controller.render(Controller.java:108) at br.com.liax.coollect.schedule.CoollectScheduler.scheduleWelcomeEmail(CoollectScheduler.java:42) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.jboss.seam.util.Reflections.invoke(Reflections.java:21) at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56) at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:31) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.transaction.TransactionInterceptor$1.work(TransactionInterceptor.java:38) at org.jboss.seam.util.Work.workInTransaction(Work.java:40) at org.jboss.seam.transaction.TransactionInterceptor.aroundInvoke(TransactionInterceptor.java:32) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:42) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.async.AsynchronousInterceptor.aroundInvoke(AsynchronousInterceptor.java:50) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:106) at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:155) at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:91) at br.com.liax.coollect.schedule.CoollectScheduler_$$_javassist_5.scheduleWelcomeEmail(CoollectScheduler_$$_javassist_5.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.jboss.seam.util.Reflections.invoke(Reflections.java:21) at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:125) at org.jboss.seam.async.AsynchronousInvocation.call(AsynchronousInvocation.java:52) at org.jboss.seam.async.Asynchronous.executeInContexts(Asynchronous.java:76) at org.jboss.seam.async.Asynchronous.execute(Asynchronous.java:45) at org.jboss.seam.async.QuartzDispatcher$QuartzJob.execute(QuartzDispatcher.java:304) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529)
What can I do to render an email inside an asynchronous method in plain tomcat?
Thanks in advance,
Petterson