/// <summary> /// this is our request that implements the ack/nak/response interaction /// adds id to subject and is expected to be used by Clients /// </summary> /// <param name="subject"></param> /// <param name="replyTo"></param> /// <param name="data"></param> /// <param name=""></param> public void protocolRequest(string subject, string data, IResponseCompletion completion = null) { Task.Factory.StartNew(() => { //create a reply to mailbox var replyTo = "TA_MBOX:" + Guid.NewGuid().ToString(); if (completion != null) { //subscribe to reply to mailbox as this is where //ack and reponse will be directed to _connection.SubscribeAsync(replyTo, (s, a) => { var dataAsString = Encoding.UTF8.GetString(a.Message.Data, 0, a.Message.Data.Length); //call through ack when ack is received if (dataAsString == "ACK") { completion.ack?.Invoke(); } else if (dataAsString == "NAK") { if (completion.nak != null) { completion.nak?.Invoke(2); //2 means not implemented, need enum... } else { //call through response ( complete ) completion.response(a.Message.Data); //unsubscribe from temporary mailbox a.Message.ArrivalSubcription.Unsubscribe(); } } }); } //publish to subject with reply to var message = new Msg(id + "." + subject, replyTo, Encoding.UTF8.GetBytes(data)); _connection.Publish(message); }); }
public void doAction(string what, IResponseCompletion callbacks) { request("action." + what, Encoding.UTF8.GetBytes(what), callbacks); }
public void doGet(string what, IResponseCompletion callbacks) { request("get", Encoding.UTF8.GetBytes(what), callbacks); }
/// <summary> /// send request and be called back for ack/nak/response /// </summary> /// <param name="subject"></param> /// <param name="payload"></param> /// <param name="callbacks"></param> public void request(string subject, byte[] payload, IResponseCompletion callbacks) { protocolRequest(subject, payload, callbacks); }