При создании слушателя 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.

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