Утешение запросов-ответов при использовании на разных платформах ( C# и JAVA)

Я пытаюсь реализовать запрос-ответ в утешении.

Однако RR-Requestor написан на C#, тогда как код для RR-Responder написан на JAVA.

У меня есть 2 проблемы:

  1. После того, как сообщение успешно отправлено API-интерфейсом Solace C#, оно получено приложением 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();
        }

Ответ содержит дополнительные символы в полученной строке. Смотрите изображение ниже.

введите описание изображения здесь

Любая идея?

Благодарю.

2 ответа

Решение

Существует несколько методов отправки / получения строк между различными API, и здесь есть 2 возможных метода.

1. Преобразуйте строку в массив байтов и присоедините ее в качестве двоичной полезной нагрузки к сообщению Утешения.

.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.
}

Если полученное сообщение является 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, а те содержат длину текста. Вы должны использовать соответствующий класс в.NET, такой как TextMessage, который выполняет анализ для вас.

Другие вопросы по тегам