0


.NET 3.5 を使用してメッセージをアクティブな mq に送信しています。これらのメッセージをキューから処理する Java リスナーがあります。

ヘッダーが含まれています

userId - long
type - string
isAdd-bool

リスナーは、ペイロードのデータ型が long であることを期待しています。したがって、ペイロードで長いデータ型を送信する必要があります。

これは、アクティブな mq にメッセージを投稿するために使用しているコードです。

string payLoad = "123";    
IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");
                    using (IConnection connection = factory.CreateConnection())
                    {
                        using (ISession session = connection.CreateSession())
                        {
                            IDestination destination = Apache.NMS.Util.SessionUtil.GetDestination(session
                                , "Message.AddUser");
                            using (IMessageProducer producer = 

session.CreateProducer(destination))
                            {
                            // Start the connection so that messages will be processed.
                            connection.Start();

                            //here i need to pass payload as datatype "long"
                            ITextMessage request = session.CreateTextMessage(payLoad);
                            request.Properties["userid"] = 123;
                            request.Properties["type"] = "USER";
                            request.Properties["isAdd"] = true;
                            producer.Send(request);

                        }

                    }
                }

現在、コードに従って、文字列をペイロードとして送信しています。

 ITextMessage request = session.CreateTextMessage(payLoad);

ペイロードを長いデータ型として送信するようにこのコードを変更するにはどうすればよいですか? ペイロードをオブジェクトとして送信しようとしました。しかし、リスナーがこのメッセージを選択するとエラーが発生します。エラー: 無効なストリーム ヘッダーが破損しています。

コメントによると、私は IStreamMessage を使用しました

            int userId = 123;
            IStreamMessage message = session.CreateStreamMessage()
            message.WriteInt64((long)idToUpdate);
            message.Properties.SetLong("userId", (long)userId);
            message.Properties.SetString("type", "USER");
            message.Properties.SetBool("isDelete", true);

次に、Tomcat ログを調べたところ、これが表示されました。これにはヘッダーがありません。私はペイロードしか持っていません

[Payload=ActiveMQStreamMessage {commandId = 5, responseRequired = true, messageId = ID:XXXXX-60790-
stamp=1400070001928, jms_redelivered=false, userId=123, type=USER, jms_messageId=ID:XXXXX-60790-635356865723233336-0:0:1:2:1}]

これが機能しなかったので、ITextMessage を使用してみました。

int userId = 123;
ITextMessage request = session.CreateTextMessage();
request.Text = idToUpdate.ToString();
request.Properties["companyId"] = (long)userId;
request.Properties["type"] = "USER";
request.Properties["isDelete"] = true;

ここに私がログで見ることができたものがあります。

[Payload=46][Headers={timestamp=1400072608501, id=dde638d2-4036-4e81-a3c8-97937ac11087, isDelete=true, jms_timestamp=1400072608280, jms_redelivered=false, userId=1, type=USER, jms_messageId=ID:xxxx-53593-635356892076410652-0:0:1:2:1}]

私はスプリント統合を使用しており、リスナーは入力パラメーターとしてリストを期待しています

public void updateUser(Message<List<Long>> message) {
    Long userId = (Long) message.getHeaders().get("userId");    
    for (Long userId : message.getPayLoad()) { // exception is thrown here "Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long"
        //doing somethign here with userid
    }
}

long データ型のペイロードを送信するにはどうすればよいですか?

4

2 に答える 2

0

TextMessage の代わりに ObjectMessage を使用できます。

ここを参照してください:

http://docs.oracle.com/javaee/6/api/javax/jms/ObjectMessage.html

于 2014-05-14T09:49:55.137 に答える