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.