2010-05-20 23 views
1

J'essaye de mettre en application jms à mon application de grails.JMS MessageCreator.createMessage() dans Grails

J'ai plusieurs consommateurs JMS dans un environnement à base de ressort listant sur un courtier ActiveMQ. J'ai écrit un client de ligne de commande de test simple qui crée messages et les reçoit d'une manière de réponse à la demande.

Voici l'extrait qui envoie un MapMessage au format Spring JMS. Cela fonctionne pour moi tant que je suis dans mon monde de printemps.

final String corrID = UUID.randomUUID().toString(); 
asyncJmsTemplate.send("test.RequestQ", new MessageCreator() 
{ 
public Message createMessage(Session session) throws JMSException { 
    try { 
    MapMessage msg = session.createMapMessage(); 
    msg.setStringProperty("json", mapper.writeValueAsString(List<of some objects>));  
    msg.setJMSCorrelationID(corrID); 
    msg.setJMSReplyTo(session.createQueue("test.ReplyQ")); 
    return msg; 
    } catch (JsonGenerationException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (JsonMappingException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    return null; 
} 
}); 

MAIS quand j'ai essayé de mettre en œuvre ces méthodes à mon Grails application de test Je reçois quelques exceptions METHOD_DEF. Envoi de TextMessages simples via le jmsTemplate.convertAndSende (Queue, Message) fourni par le plugin JMS fonctionne.

Quelqu'un peut-il m'aider? Est-ce un problème courant?

Vive Hans

+0

BTW, tout comme avec 100s d'autres questions au sujet de quoi que ce soit ... il est presque toujours préférable de montrer l'exception (s), même si c'est juste la première ligne, que de dire "une exception XXX". – billjamesdev

Répondre

0

Pas vraiment essayer ceci, je dois croire que c'est un problème de syntaxe. Ce que vous faites vraiment avec cette classe anonyme est de passer une fermeture contenant tout le code MessageCreator dans le constructeur de la classe MessageCreator. Dans Groovy, les fermetures peuvent être passées comme dernier argument d'une fonction simplement en le plaçant après le nom de la fonction ou les premiers arguments entre parenthèses.

SomeFunction(arg1, arg2) { some code } 

est le même que

SomeFunction(arg1, arg2, { some code }) 

Qu'est-ce que vous voulez vraiment est de convertir la fermeture en une instance anonyme d'un MessageCreator, que je crois que vous pouvez accomplir par:

asyncJmsTemplate.send("test.RequestQ", 
      { code in the anonymous block } as MessageCreator); 

J'ai trouvé ça sur StackOverflow, en fait, mais c'est une question mal créée. Lisez toutes les réponses, et vous devriez voir quelque chose de pertinent: Best groovy closure idiom replacing java inner classes?

0

J'ai eu les mêmes problèmes et voici ma solution de travail: J'ai créé une nouvelle MyMessageCreator de classe dans le dossier src qui implémente l'origine l'interface JMS MessageCreator. Avec cela, je peux créer un nouvel objet MyMessageCreator et appeler la fonction createMessage (Session session) pour générer un nouveau message.

Pour obtenir l'objet de session, j'utilise le jmsTemplate.

public class MyMessageCreator implements MessageCreator { 

    @Override 
    public Message createMessage(Session session) throws JMSException { 
     return session.createMapMessage(); 
    } 

} 

Voici le code groovy concerné:

Session session = jmsTemplate.getConnectionFactory().createConnection().createSession(false, Session.AUTO_ACKNOWLEDGE) 
MapMessage msg = new MyMessageCreator().createMessage(session); 

Hope this helps, Mirko