Я пытаюсь реализовать Request-Response в Solace.Проблемы с запросом на устранение неполадок при использовании на разных платформах (C# и JAVA)
Однако RR-Requestor написан на C#, тогда как код для RR-Responder написан в JAVA.
Я 2 вопроса:
После того, как сообщение отправлено на # API Solace C, то полученные с помощью приложения JAVA. Я получаю сообщение в структуре BytesXMLMessage. Как преобразовать сообщение в String? message.dump() дает мне полную информацию.
Когда я отправляю ответное сообщение, приложение .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();
}
Ответ содержит дополнительные символы в строке, полученной. См. Изображение ниже.
Любая идея?
Спасибо.
Большое спасибо @Russell Sim –
Также я считаю, if (session.SendRequest (requestMessage, out r eplyMessage, 4000) == ReturnCode.SOLCLIENT_OK) {} - способ отправки сообщения. Он ждет до 4 секунд, пока сообщение для сообщения ответа не поступит. Как мы можем заставить его ждать бесконечно? Если мы не уверены, сколько времени RRRsponder собирается предпринять, чтобы ответить. –
@Dixit Невозможно сделать этот метод неопределенным. Вы можете использовать огромное значение таймаута (Int32.MaxValue) для имитации неопределенного ожидания. Тем не менее, лучше использовать приложение не ждать бесконечно и на самом деле заставить его действовать через определенное время. Возможно, уведомление пользователю в порядке? Возможно, вы можете подумать о повторной отправке сообщения после определенного количества времени ожидания. –