1

grailsアプリケーションにjmsを実装しようとしています。

ActiveMQブローカーにリストされている春ベースの環境にいくつかのJMSコンシューマーがあります。メッセージを作成し、要求応答方式で受信する簡単なテストコマンドラインクライアントを作成しました。

これは、SpringJMSの方法で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

私は同じ問題を抱えていましたが、これが私の実用的な解決策です。元の JMS MessageCreator インターフェイスを実装する src フォルダーに新しいクラス MyMessageCreator を作成しました。

これにより、新しい 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 に答える
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で見つけましたが、作成が不十分な質問です。すべての応答を読むと、関連するものが表示されるはずです: Java 内部クラスを置き換える最高のグルーヴィーなクロージャーイディオム?

于 2010-05-21T05:06:34.457 に答える