2010-08-17 14 views
0

Dans mon application, j'essaie d'envoyer des e-mails à nos clients lorsqu'un "événement se produit", par exemple. comme quand nous recevons un paiement ou un nouveau client se connecter ...Impossible d'obtenir des objets de domaine à partir de l'écouteur JMS

Je suis capable de capturer à ces événements et j'essaye d'envoyer le courrier et voici le problème J'utilise JMS pour avoir tout cet envoi La fonctionnalité de messagerie dans le fond.

Ainsi, lorsqu'un nouveau client s'inscrit, j'enregistre ses détails dans la base de données et un événement est généré. Maintenant, pour envoyer du courrier que je dois accéder à l'information du client (ou tout autre objet de domaine qui est pertinent) en utilisant le code ci-dessous

protected Map getObjectsMap(Map domainMap){ 
    Map objectsMap = [:] 
    domainMap.each{key,value-> 
     def dc = grailsApplication.domainClasses.find{it.getFullName().equals(key)} 
     // println "dc=$dc; dump=${dc.dump()}" // org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass 

     def obj = dc.clazz.get(value) 
     //println "value=$value return=$obj; dc.clazz=$dc.clazz; dump=${dc.clazz.dump()}" 
     if(!obj) { 
      log.error "Could not find object of type $key with id=$value" 
      //def session = sessionFactory.currentSession 
      //println "session=$session; dump=${session?.dump()}" 

     } 
     String objectName = key.substring(key.lastIndexOf(".")+1) 
     objectName = objectName.charAt(0).toLowerCase().toString() + objectName.substring(1) 
     objectsMap.put(objectName, obj) 
    } 
    return objectsMap 
} 

Le problème est que ce code fonctionne sur ma machine locale (ce qui est plus lent), mais pas sur le serveur de production.

Je pense que ce qui se passe, c'est que cette tâche d'arrière-plan est exécutée avant que l'objet ne soit enregistré dans la base de données. (J'ai le .save (flush: true) quand je sauve l'instance). Voici la trace de pile que je reçois

biz.MailService Could not find object of type customer.Customer with id=5 
biz.MailService Could not find object of type customer.Customer with id=5 
biz.MailService Could not find object of type payment.Payment with id=7 
biz.MailService Could not find object of type payment.Payment with id=7 
Mail$$EnhancerByCGLIB$$25d09edf.send Exception raised in message listener 
org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'send' threw exception; nested exception is java.lang.AssertionError: Could not find the org property. Dumping objectMap: [customer:null, payment:null]. Dumping domainMap: [com.blusynergy.blubilling.customer.Customer:5, com.blusynergy.blubilling.payment.Payment:7]. Expression: org. Values: org = null 
    at org.springframework.jms.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:471) 
    at grails.plugin.jms.listener.adapter.LoggingListenerAdapter.super$2$invokeListenerMethod(LoggingListenerAdapter.groovy) 
    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:597) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1049) 
    at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:923) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:127) 
    at grails.plugin.jms.listener.adapter.PersistenceContextAwareListenerAdapter.invokeListenerMethod(PersistenceContextAwareListenerAdapter.groovy:29) 
    at org.springframework.jms.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:355) 
    at grails.plugin.jms.listener.adapter.LoggingListenerAdapter.super$2$onMessage(LoggingListenerAdapter.groovy) 
    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:597) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1049) 
    at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:923) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:127) 
    at grails.plugin.jms.listener.adapter.LoggingListenerAdapter.onMessage(LoggingListenerAdapter.groovy:33) 
    at grails.plugin.jms.listener.adapter.PersistenceContextAwareListenerAdapter.super$3$onMessage(PersistenceContextAwareListenerAdapter.groovy) 
    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:597) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1049) 
    at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:923) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:127) 
    at grails.plugin.jms.listener.adapter.PersistenceContextAwareListenerAdapter.onMessage(PersistenceContextAwareListenerAdapter.groovy:18) 
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:534) 
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:495) 
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467) 
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:323) 
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:261) 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:977) 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:969) 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:871) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.lang.AssertionError: Could not find the org property. Dumping objectMap: [customer:null, payment:null]. Dumping domainMap: [com.blusynergy.blubilling.customer.Customer:5, com.blusynergy.blubilling.payment.Payment:7]. Expression: org. Values: org = null 
    at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:379) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(ScriptBytecodeAdapter.java:662) 
    at com.blusynergy.blubilling.biz.MailService.send(MailService.groovy:185) 
    at com.blusynergy.blubilling.biz.MailService$$FastClassByCGLIB$$88e80e6a.invoke(<generated>) 
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149) 
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:692) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625) 
    at com.blusynergy.blubilling.biz.MailService$$EnhancerByCGLIB$$25d09edf.send(<generated>) 
    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:597) 
    at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:273) 
    at org.springframework.jms.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:463) 
    ... 43 more 

Des idées sur la façon dont je peux résoudre ce problème .. ??

Cordialement.

Répondre

0

Créez-vous les objets dans une transaction?

Si tel est le cas, assurez-vous d'envoyer le message une fois la transaction terminée. Si ce n'est pas le cas, peut-être mettre en œuvre une sorte de système de réessai.

acclamations

Lee