[jboss-user] [JBoss Seam] - Plain Tomcat + Quartz + Mail work together?

pettersonfp do-not-reply at jboss.com
Tue Dec 4 17:45:23 EST 2007


Hello,

  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

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4110366#4110366

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4110366



More information about the jboss-user mailing list