1

Solace で Request-Response を実装しようとしています。

ただし、RR-Requestor は C# で記述されていますが、RR-Responder のコードは Java で記述されています。

私は2つの問題を抱えています:

  1. メッセージが Solace C# API によって正常に送信された後、JAVA アプリケーションによって受信されます。たまたまBytesXMLMessage構造でメッセージを受け取りました。メッセージを文字列に変換するにはどうすればよいですか? message.dump() は詳細をすべて教えてくれます。

  2. 返信メッセージを送信すると、.NET アプリケーションは不要な文字が追加されたメッセージを受信します。

JAVA 側で使用されるコード:

    //After session is created
    XMLMessageConsumer consumer = session.getMessageConsumer(new RequestHandler());
    XMLMessageProducer producer = session.getMessageProducer(new PrintingPubCallback());
    consumer.start();
    session.addSubscription(
            JCSMPFactory.onlyInstance().createTopic("Test_Response_Queue"),
            true);
    class RequestHandler implements XMLMessageListener {

    private void sendReply(BytesXMLMessage request, BytesXMLMessage reply)
            throws JCSMPException {

        producer.sendReply(request, reply);

    }

    public void onException(JCSMPException arg0) {
        // TODO Auto-generated method stub

    }

    public void onReceive(BytesXMLMessage message) {
        System.out.println("Received request message, trying to parse it");

        System.out.println(message.dump());

        try {

            TextMessage textMessage = JCSMPFactory.onlyInstance()
                    .createMessage(TextMessage.class);

            final String text = "Reply from JAVA, text message!!";
            textMessage.setText(text);

            sendReply(message, textMessage);

        } catch (JCSMPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

そして.NET側では

            // Create the request message
        IMessage requestMessage = ContextFactory.Instance.CreateMessage();
        requestMessage.Destination = ContextFactory.Instance.CreateTopic("Test_Response_Queue");
        requestMessage.DeliveryMode = MessageDeliveryMode.Direct; /* explicitly set to MessageDeliveryMode.Direct */
        //IStreamContainer stream = SDTUtils.CreateStream(requestMessage, 256);
        //stream.AddString("Hello from Linux!!");
        requestMessage.BinaryAttachment = Encoding.ASCII.GetBytes("Hello from Linux!!");

        // Send the request message to the service or RRDirectReplier
        IMessage replyMessage = null;
        int timeout = 2000; /* 2 secs*/
        Console.WriteLine("\nSending  request message, waiting for {0} msecs for a reply (make sure that RRDirectReply is running) ...", timeout);

        if (session.SendRequest(requestMessage, out replyMessage, 2000) == ReturnCode.SOLCLIENT_OK)
        {
            // Got a reply, format and print the response message
            Console.WriteLine("\nGot reply message");
            String str = Encoding.ASCII.GetString(replyMessage.BinaryAttachment);
            Console.WriteLine(str);
        }
        else
        {
            Console.WriteLine("Request failed");
        }
        if (requestMessage != null)
        {
            // It is a good practice to dispose of messages once done using them
            requestMessage.Dispose();
        }

返信には、受信した文字列に追加の文字が含まれています。下の画像を参照してください。

ここに画像の説明を入力

何か案が?

ありがとう。

4

2 に答える 2

3

受信したメッセージが TextMessage の場合は、次のことを試してください。

if (message instanceof TextMessage) {
    String text = ((TextMessage) message).getText();
} 
//otherwise retrieve the attachment buffer like this
else {
    byte[] body = message.getAttachmentByteBuffer().array();
    //and convert to String
    String text = new String(body);
}

返信として TextMessage を作成しているため、返信メッセージの先頭に余分な文字が表示されている可能性があります。TextMessage には、添付ファイルの先頭に TextMessage としてマークするための余分なバイトがいくつか含まれており、それらにはテキストの長さが含まれています。解析を行う TextMessage のような .NET の対応するクラスを使用する必要があります。

于 2015-10-14T15:58:37.017 に答える
3

異なる API 間で文字列を送受信する方法はいくつかありますが、ここでは 2 つの方法を示します。

1. 文字列をバイト配列に変換し、バイナリ ペイロードとして Solace メッセージに添付します。

.NET 送信:

IMessage message = ContextFactory.Instance.CreateMessage();
message.Destination = topic;
message.BinaryAttachment = Encoding.UTF8.GetBytes("My .NET String");
session.Send(message);

Java 受信:

// assuming that message is a reference to a received message
if(message.getAttachmentByteBuffer() != null) {
    byte[] messageBinaryPayload = message.getAttachmentByteBuffer().array();
    try {
        String myReceivedText = new String(messageBinaryPayload, "UTF-8");
        System.out.println("Received String = " + myReceivedText);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}
else {
    // No binary attachment in message - application needs to decide what to do next.
}

Java 送信:

String myJavaString = "My Java String";
BytesXMLMessage message = JCSMPFactory.onlyInstance().createMessage(BytesXMLMessage.class);
message.writeAttachment(myJavaString.getBytes(Charset.forName("UTF-8")));
producer.send(message, topic);

.NET 受信:

// assuming that message is a reference to a received message
byte[] messageBinaryPayload = message.BinaryAttachment;

if(messageBinaryPayload != null) {
    string myReceivedString = System.Text.Encoding.UTF8.GetString(messageBinaryPayload);
    Console.WriteLine("Received String = " + myReceivedString);
}
else {
    // No binary attachment in message - application needs to decide what to do next.
}

2. 文字列を TextMessage として送受信する

.NET 送信:

IMessage message = ContextFactory.Instance.CreateMessage();
message.Destination = topic;
SDTUtils.SetText(message, "My .NET String");
session.Send(message);

Java 受信:

// assuming that message is a reference to a received message
if (message instanceof TextMessage) {
    String myReceivedString = ((TextMessage) message).getText();
    System.out.println("Received String = " + myReceivedString);
} 
else {
    // Message is not a TextMessage - application needs to decide what to do next.
}

Java 送信:

TextMessage message = JCSMPFactory.onlyInstance().createMessage(TextMessage.class);
message.setText("My Java String");
producer.send(message, topic);

.NET 受信:

// assuming that message is a reference to a received message
String myReceivedString = SDTUtils.GetText(message);
if (myReceivedString != null) {
    // Message is an TextMessage
    Console.WriteLine("Received String = " + myReceivedString);
}
else {
    // Message is not a TextMessage - application needs to decide what to do next.
}
于 2015-10-15T06:02:18.350 に答える