Ejemplo n.º 1
0
        public void TestConsumerStateChangeNotification()
        {
            // Consumer JobStateChange
            var env = new RPCEnvelope();
            var con = new JobStateChange();

            env.Message   = con;
            env.Operation = con.GetType().Name;
            con.Id        = Guid.NewGuid();
            con.Timestamp = DateTime.UtcNow;
            con.State     = "Setup";

            var iso = new Newtonsoft.Json.Converters.IsoDateTimeConverter();

            iso.DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK";

            string json = Newtonsoft.Json.JsonConvert
                          .SerializeObject(env, iso);

            // Orchestrator JobStateChange
            JToken token = JObject.Parse(json);
            String op    = (string)token.SelectToken("Operation");
            JToken msg   = token.SelectToken("Mesage");

            Assert.IsTrue(op == "JobStateChange");

            var serializer = new Newtonsoft.Json.JsonSerializer();

            Newtonsoft.Json.JsonReader reader = token["Message"].CreateReader();

            var job = serializer.Deserialize <JobStateChange>(reader);

            Assert.AreEqual(((JobStateChange)env.Message).State, job.State);
        }
        internal static void Send(JobStateChange msg)
        {
            var env = new RPCEnvelope();

            env.Message          = msg;
            env.Operation        = "JobStateChange";
            env.ResponseQueueUrl = null;
            Send(msg.GetType().Name, JsonConvert.SerializeObject(env));
        }
        static public void Send(UnRegister msg)
        {
            var env = new RPCEnvelope();

            env.Message          = msg;
            env.Operation        = "UnRegister";
            env.ResponseQueueUrl = null;
            Send(msg.GetType().Name, JsonConvert.SerializeObject(env));
        }
        static public RegistrationInfo SendReceive(Register msg)
        {
            Debug.WriteLine("Send Register Message", "SimpleMessageConnect.SendReceive");
            var env = new RPCEnvelope();

            env.Message          = msg;
            env.Operation        = "Register";
            env.ResponseQueueUrl = Open(String.Format("{0}{1}", responseQueuePrefix, msg.ConsumerId));
            Send(msg.GetType().Name, JsonConvert.SerializeObject(env));
            var rsp = ReceiveRegistration(env);

            return(rsp);
        }
Ejemplo n.º 5
0
        public void SendRegistrationInfo(RPCEnvelope msg)
        {
            var env     = new RPCEnvelope();
            var regInfo = new RegistrationInfo();

            env.Message   = regInfo;
            env.Operation = regInfo.GetType().Name;

            regInfo.RequestId   = msg.Message.Id;
            regInfo.Id          = Guid.NewGuid();
            regInfo.Timestamp   = DateTime.UtcNow;
            regInfo.JobQueueUrl = submitQueueUrl;
            env.Message         = regInfo;
            Debug.WriteLine("Send RegistrationInfo to " + msg.ResponseQueueUrl);
            queue.SendMessage(new Amazon.SQS.Model.SendMessageRequest()
                              .WithDelaySeconds(0)
                              .WithQueueUrl(msg.ResponseQueueUrl)
                              .WithMessageBody(JsonConvert.SerializeObject(env)));
        }
Ejemplo n.º 6
0
        public RPCEnvelope[] Listen()
        {
            Setup();

            var rsp = queue.ReceiveMessage(new Amazon.SQS.Model.ReceiveMessageRequest()
                                           .WithWaitTimeSeconds(20)
                                           .WithMaxNumberOfMessages(10)
                                           .WithQueueUrl(requestQueueUrl));

            if (!rsp.IsSetReceiveMessageResult())
            {
                Debug.WriteLine("No Messages Available");
                return(null);
            }

            if (!rsp.ReceiveMessageResult.IsSetMessage())
            {
                Debug.WriteLine("Message not set");
                return(null);
            }
            List <RPCEnvelope> envList = new List <RPCEnvelope>();
            RPCEnvelope        env     = null;
            var deleteList             = new List <Amazon.SQS.Model.DeleteMessageBatchRequestEntry> {
            };

            foreach (var msg in rsp.ReceiveMessageResult.Message)
            {
                // NOTE: These are SNS Messages so need to parse that envelope off
                // Type,MessageId,TopicArn,Subject,Message,Timestamp,SignatureVersion,Signature,
                // SigningCertURL,UnsubscribeURL
                //
                Debug.WriteLine("Message: " + msg.Body);
                JToken token   = JObject.Parse(msg.Body);
                JToken jmsg    = token.SelectToken("Message");
                JToken subject = token.SelectToken("Subject");

                if (msg.IsSetReceiptHandle())
                {
                    deleteList.Add(new Amazon.SQS.Model.DeleteMessageBatchRequestEntry()
                                   .WithReceiptHandle(msg.ReceiptHandle)
                                   .WithId(Guid.NewGuid().ToString()));
                }

                Dictionary <string, Object> d;
                try
                {
                    //env = serializer.Deserialize<RPCEnvelope>(reader);
                    env = JsonConvert.DeserializeObject <RPCEnvelope>(jmsg.ToString());
                    d   = JsonConvert.DeserializeObject <Dictionary <string, Object> >(jmsg.ToString());
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(String.Format("Ignore exception deserializing: {0}", ex), GetType().Name);
                    continue;
                }

                var responseQueueUrl = env.ResponseQueueUrl;
                var operation        = env.Operation;
                var serializer       = new Newtonsoft.Json.JsonSerializer();
                Newtonsoft.Json.JsonReader reader = jmsg.CreateReader();
                var content = d["Message"].ToString();

                if (operation == "Register")
                {
                    Debug.WriteLine("Found: " + operation);
                    //env.Message = serializer.Deserialize<Register>(reader);
                    env.Message = JsonConvert.DeserializeObject <Register>(content);
                }
                else
                {
                    Debug.WriteLine("Ignore: " + operation);
                    continue;
                }

                envList.Add(env);
            }
            var entries = deleteList.ToArray <Amazon.SQS.Model.DeleteMessageBatchRequestEntry>();
            // Delete Messages
            var deleteResponse = queue.DeleteMessageBatch(new Amazon.SQS.Model.DeleteMessageBatchRequest()
                                                          .WithQueueUrl(requestQueueUrl)
                                                          .WithEntries(entries));

            return(envList.ToArray <RPCEnvelope>());
        }
        /// <summary>
        /// ReceiveRegistration:  Response occurs on a dedicated queue so all messages not
        /// conforming to expected result are deleted and ignored.
        /// </summary>
        /// <param name="registerRequest"></param>
        /// <returns></returns>
        internal static RegistrationInfo ReceiveRegistration(RPCEnvelope registerRequest)
        {
            Turbine.Consumer.Contract.Behaviors.IConsumerContext ctx = Turbine.Consumer.AppUtility.GetConsumerContext();
            IAWSContext awsCtx = Turbine.Consumer.AWS.AppUtility.GetContext();

            var queue = Amazon.AWSClientFactory.CreateAmazonSQSClient(
                awsCtx.AccessKey, awsCtx.SecretKey,
                new Amazon.SQS.AmazonSQSConfig().WithServiceURL(awsCtx.Region)
                );

            Amazon.SQS.Model.ReceiveMessageResponse receiveMsgResponse;
            var entries = new List <Amazon.SQS.Model.DeleteMessageBatchRequestEntry>();

            // NOTE: Should only be 1 message on queue, but grab 'all' and delete 'all'.
            do
            {
                Debug.WriteLine(String.Format("Register: Poll Queue {0} for response", registerRequest.ResponseQueueUrl),
                                registerRequest.Operation);
                receiveMsgResponse = queue.ReceiveMessage(new Amazon.SQS.Model.ReceiveMessageRequest()
                                                          .WithWaitTimeSeconds(20)
                                                          .WithMaxNumberOfMessages(10)
                                                          .WithQueueUrl(registerRequest.ResponseQueueUrl));
            } while (receiveMsgResponse.IsSetReceiveMessageResult() == false || receiveMsgResponse.ReceiveMessageResult.IsSetMessage() == false);

            // Response Message Should Have ResponseQueue & SNS Topic
            List <Amazon.SQS.Model.Message> msgResultMsg = receiveMsgResponse.ReceiveMessageResult.Message;

            Debug.WriteLine(String.Format("Count {0} Messages found", msgResultMsg.Count), registerRequest.Operation);

            if (msgResultMsg.Count == 0)
            {
                return(null);
            }

            RegistrationInfo regInfo = null;

            //Dictionary<string, Object> d;

            // NOTE: Very inefficient, double parsing etc.
            // Consider typing at the RPCEnvelope level
            foreach (Amazon.SQS.Model.Message smsg in msgResultMsg)
            {
                Debug.WriteLine(String.Format("Messages found {0}", smsg.Body), registerRequest.Operation);
                entries.Add(new Amazon.SQS.Model.DeleteMessageBatchRequestEntry()
                            .WithId(smsg.MessageId)
                            .WithReceiptHandle(smsg.ReceiptHandle));
                RPCEnvelope registerResponse = null;
                JToken      token            = JObject.Parse(smsg.Body);
                JToken      jmsg             = token.SelectToken("Message");

                try
                {
                    registerResponse = JsonConvert.DeserializeObject <RPCEnvelope>(smsg.Body);
                    //d = JsonConvert.DeserializeObject<Dictionary<string, Object>>(jmsg.ToString());
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(String.Format("RPCEnvelope ignore exception deserializing: {0}", ex),
                                    registerRequest.Operation);
                    continue;
                }

                //ack = (Turbine.Orchestrator.AWS.Data.Contract.Messages.RegistrationInfo)rsp.Message;
                var serializer = new Newtonsoft.Json.JsonSerializer();
                Newtonsoft.Json.JsonReader reader = jmsg.CreateReader();
                //var content = d["Message"].ToString();
                var content = jmsg.ToString();
                try
                {
                    regInfo = JsonConvert.DeserializeObject <RegistrationInfo>(content);
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(String.Format("RegistrationInfo ignore exception deserializing: {0}", ex),
                                    registerRequest.Operation);
                    continue;
                }

                //registerRequest.Message = regInfo;
                if (regInfo.RequestId != registerRequest.Message.Id)
                {
                    var s = String.Format("Mismatch Request-Response Id : {0} != {1}", regInfo.Id, registerRequest.Message.Id);
                    Debug.WriteLine(s, regInfo.GetType().Name);
                    continue;
                }
                break;
            }

            if (entries.Count > 0)
            {
                // Delete all messages found
                var delMsgBatchRsp = queue.DeleteMessageBatch(
                    new Amazon.SQS.Model.DeleteMessageBatchRequest()
                    .WithQueueUrl(registerRequest.ResponseQueueUrl)
                    .WithEntries(entries.ToArray <Amazon.SQS.Model.DeleteMessageBatchRequestEntry>()));
            }
            return(regInfo);
        }