Creating TIBCO Rendezvous Listener wait for response on different subject and candidate event key

1.3k views Asked by At

Messages published and response received are on two different subjects. Right now I have following set of functionality in my java class. Class is implementing TibrvMsgCallback interface. How can i make sure that whatever the message is published i am receiving exactly its response?

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

There are 1 answers

2
dsolimano On BEST ANSWER

When you send a message, add another field

var correlation_id = Guid.NewGuid().ToString();
msg.add("CORRELATION_ID", correlation_id);

and then stash that correlation ID somewhere, in a hash set perhaps.

Have the publisher read the CORRELATION_ID off of the request and add it to the response.

When you receive a message, only process it if it has the ID that you are expecting in the CORRELATION_ID field.