JMS MessageCreator.createMessage () в Grails - PullRequest
1 голос
/ 20 мая 2010

Я пытаюсь внедрить JMS в мое приложение Grails.

У меня есть несколько потребителей JMS в листинге окружения на основе весны на брокере ActiveMQ. Я написал простой тестовый клиент командной строки, который создает сообщения и получает их в форме ответа на запрос.

Вот фрагмент, который отправляет MapMessage в Spring JMS. Это работает для меня, пока я нахожусь в моем весеннем мире.

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;
 }
});

НО , когда я пытался внедрить этот метод в мое тестовое приложение Grails Я получаю некоторые исключения METHOD_DEF. Отправка простых текстовых сообщений через jmsTemplate.convertAndSende (очередь, сообщение), предоставленный Плагин JMS работает.

Может ли кто-нибудь помочь мне? Это общая проблема?

Приветствия Ганса

Ответы [ 2 ]

0 голосов
/ 21 мая 2010

У меня были такие же проблемы, и вот мое рабочее решение: Я создал новый класс MyMessageCreator в папке src, который реализует исходный интерфейс JMS MessageCreator.

С этим я могу создать новый объект MyMessageCreator и вызвать функцию createMessage (Session session) для генерации нового сообщения.

Чтобы получить объект сеанса, я использую jmsTemplate.

public class MyMessageCreator implements MessageCreator {

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

}

Вот соответствующий заводной код:

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

Надеюсь, это поможет, Mirko

0 голосов
/ 21 мая 2010

На самом деле не пробую это, я должен верить, что это проблема синтаксиса. То, что вы действительно делаете с этим анонимным классом, это передача замыкания, содержащего весь код MessageCreator, в конструктор класса MessageCreator. В Groovy замыкания можно передавать как последний аргумент функции, просто поместив ее после имени функции или первых аргументов в скобках.

SomeFunction( arg1, arg2) { some code }

совпадает с

SomeFunction( arg1, arg2, { some code } )

Что вам действительно нужно, так это преобразовать замыкание в анонимный экземпляр MessageCreator, который, я полагаю, вы можете выполнить:

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

Я обнаружил это в StackOverflow, хотя этот вопрос плохо создан. Прочитайте все ответы, и вы должны увидеть что-то подходящее: Лучшая идиома Groovy Closure, заменяющая внутренние классы Java?

...