При создании слушателя TIBCO Rendezvous ждите ответа на другой предмет и ключ события-кандидата.
Опубликованные сообщения и полученные ответы относятся к двум различным темам. Прямо сейчас у меня есть следующий набор функций в моем классе Java. Класс реализует интерфейс TibrvMsgCallback. Как я могу убедиться, что независимо от того, опубликовано ли сообщение, я получаю именно его ответ?
public class TibcoRVUtility implements TibrvMsgCallback {
public void onMsg(TibrvListener listener, TibrvMsg msg) {
try {
_log.info("Request and Response found");
msgReceived = true;
} catch (final TibrvException ex) {
_log.error("Exception@" + this.getClass().getName() + ".onMsg", ex);
}
}
private void sendMessage(String messageString, final String soType,
final String responseSubject) {
try {
Tibrv.open(Tibrv.IMPL_NATIVE);
TibrvTransport transport = new TibrvRvdTransport(tibcoSetting.getService(), tibcoSetting.getNetwork(),
tibcoSetting.getDaemon());
String inboxName = transport.createInbox();
TibrvMsg msg = new TibrvMsg();
msg.setSendSubject("PUBLISH_SUBJECT");
msg.add("DATA", "DUMMY_MESSAGE");
TibrvListener listener = new TibrvListener(Tibrv.defaultQueue(), this, transport, responseSubject, null);
transport.send(msg);
_log.info("msg" + msg.toString());
_log.info("message successfully sent.");
while (!msgReceived) {
try {
Tibrv.defaultQueue().dispatch();
} catch (InterruptedException ex) {
_log.error("Exception@" + this.getClass().getName() + ".sendMessage", ex);
break;
} catch (TibrvException ex) {
_log.error("Exception@" + this.getClass().getName() + ".sendMessage", ex);
break;
}
}
listener.destroy();
transport.destroy();
} catch (TibrvException e) {
_log.error("Exception@" + this.getClass().getName() + ".sendMessage", e);
}
}
}
1 ответ
Решение
Когда вы отправляете сообщение, добавьте другое поле
var correlation_id = Guid.NewGuid().ToString();
msg.add("CORRELATION_ID", correlation_id);
а затем спрятать этот идентификатор корреляции где-нибудь, возможно, в хэш-наборе.
Попросите издателя прочитать CORRELATION_ID из запроса и добавить его в ответ.
Получив сообщение, обработайте его только в том случае, если оно имеет ожидаемый идентификатор в поле CORRELATION_ID.