1

我正在尝试在我的 grails 应用程序中实现 jms。

我在 ActiveMQ 代理上基于 Spring 的环境中列出了几个 JMS 消费者。我编写了一个简单的测试命令行客户端,它创建消息并以请求响应的方式接收它们。

这是以 Spring JMS 方式发送 MapMessage 的片段。只要我在我的春天世界,这对我有用。

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 异常。通过 JMS 插件提供的 jmsTemplate.convertAndSende(Queue, Message) 发送简单的 TextMessage 是可行的。

谁能帮我?这是个常见的问题吗?

干杯汉斯

4

2 回答 2

0

实际上没有尝试过,我不得不相信这是一个语法问题。您真正使用该匿名类所做的是将包含所有 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 上发现了这一点,尽管这是一个糟糕的问题。阅读所有回复,您应该会看到相关内容:Best groovy Closure idiom replace java inner classes?

于 2010-05-21T05:06:34.457 回答
0

我遇到了同样的问题,这是我的工作解决方案:我在 src 文件夹中创建了一个新类 MyMessageCreator,它实现了原始 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);

希望这会有所帮助,米尔科

于 2010-05-21T19:02:03.790 回答