예제 #1
0
파일: Agent.cs 프로젝트: xxjeng/nuxleus
        //public MemoryStream ResultStream { get { return m_memoryStream; } set { m_memoryStream = value; } }

        //public TransformResponse MakeRequest (IRequest request, AsyncCallback callback, Nuxleus.Agent.NuxleusAsyncResult asyncResult, object extraData) {
        //    //if (m_postOffice == null) {
        //    //    m_postOffice = m_loadBalancer.GetPostOffice;
        //    //}
        //    //Console.WriteLine("Transform reached");
        //    //TransformRequest tr = (TransformRequest)request;
        //    //m_transform.BeginTransformProcess((TransformRequest)request, callback, asyncResult);
        //    //m_resultHashtable[tr.ID] = tr.TransformResult;
        //    //Console.WriteLine("TransformIsComplete reached w. GUID: {0}.  Hashtable has: {1} entries.", tr.ID.ToString(), m_resultHashtable.Count);
        //    //Console.WriteLine("End of Invoke Reached");
        //    //return asyncResult;

        //}

        public IAsyncResult BeginRequest(IRequest request, AsyncCallback callback, Nuxleus.Core.NuxleusAsyncResult asyncResult, object extraData) {
            //if (m_postOffice == null) {
            //    m_postOffice = m_loadBalancer.GetPostOffice;
            //}
            Console.WriteLine("Transform reached");
            TransformRequest tr = (TransformRequest)request;
            m_transform.BeginTransformProcess((TransformRequest)request);
            m_resultHashtable[tr.ID] = tr.TransformResult;
            Console.WriteLine("TransformIsComplete reached w. GUID: {0}.  Hashtable has: {1} entries.", tr.ID.ToString(), m_resultHashtable.Count);
            Console.WriteLine("End of Invoke Reached");
            return asyncResult;

        }
예제 #2
0
        private Nuxleus.Bucker.Message HandleGetMessageRequest(Nuxleus.Bucker.Message m)
        {
            Nuxleus.Bucker.Message err = CheckQueue(m.QueueId);
            if (err != null)
                return err;

            err = CheckMessageId(m.MessageId);
            if (err != null)
                return err;

            string unreadKey = String.Format("{0}.new", m.QueueId);

            string[] keys = { m.QueueId, unreadKey, m.MessageId };
            IDictionary<string,object> result = mc.Get(keys);

            object keyValue;
            if (!mc.TryGet(m.QueueId, out keyValue))
            {
                m.Type = "error";
                m.Op = null;
                m.Error = new Nuxleus.Bucker.Error();
                m.Error.Type = "not-found";
                m.Error.Code = 404;
                m.Error.Message = String.Format("'{0}' is not an existing queue", m.QueueId);
                return m;
            }

            string mids = (string)result[m.QueueId];

            object messageValue;
            if (mc.TryGet(m.MessageId, out messageValue))
            {
                if (m.Op.Peek == false)
                {
                    string unread = (string)result[unreadKey];
                    if (unread.Contains(m.MessageId))
                    {
                        unread = unread.Replace(m.MessageId, "");
                        unread = unread.Replace(",,", "");
                        unread = unread.Trim(comma);
                        mc.Store(StoreMode.Set, unreadKey, unread);
                    }
                }
                string visibilityKey = String.Format("{0}.visibility", m.MessageId);
                double visibilityTimeout = (double)mc.Get(visibilityKey);
                double now = UnixTimestampNow;
                if (now > visibilityTimeout)
                {
                    if (m.Op.Peek == false)
                        mc.Store(StoreMode.Set, visibilityKey, now + 30);
                    string payload = String.Empty;
                    if (result.ContainsKey(m.MessageId))
                    {
                        payload = (string)result[m.MessageId];
                        if (payload == null)
                            payload = String.Empty;
                    }
                    m.Type = "response";
                    m.Payload = payload;
                }
                else
                {
                    err = new Nuxleus.Bucker.Message();
                    err.Type = "error";
                    err.Op = null;
                    err.Error = new Nuxleus.Bucker.Error();
                    err.Error.Type = "invisible";
                    err.Error.Code = 404;
                    err.Error.Message = String.Format("'{0}' is not visible", m.MessageId);
                }
            }
            else
            {
                err = new Nuxleus.Bucker.Message();
                err.Type = "error";
                err.Op = null;
                err.Error = new Nuxleus.Bucker.Error();
                err.Error.Type = "not-found";
                err.Error.Code = 404;
                err.Error.Message = String.Format("'{0}' was not found in the queue '{1}'", m.MessageId, m.QueueId);
            }

            return m;
        }
예제 #3
0
        private Nuxleus.Bucker.Message HandleDeleteMessageRequest(Nuxleus.Bucker.Message m)
        {
            Nuxleus.Bucker.Message err = CheckQueue(m.QueueId);
            if (err != null)
                return err;

            err = CheckMessageId(m.MessageId);
            if (err != null)
                return err;

            string keys = (string)mc.Get(String.Format("{0}", m.QueueId));
            if (keys == null)
                keys = String.Empty;
            if (keys.Contains(m.MessageId))
            {
                keys = keys.Replace(m.MessageId, "");
                keys = keys.Replace(",,", "");
                keys = keys.Trim(comma);
                mc.Store(StoreMode.Set, m.QueueId, keys);
            }

            mc.Remove(String.Format("{0}.visibility", m.MessageId));
            mc.Remove(m.MessageId);

            m.Type = "response";
            return m;
        }
예제 #4
0
        private Nuxleus.Bucker.Message HandlePushMessageRequest(Nuxleus.Bucker.Message m)
        {
            Nuxleus.Bucker.Message err = CheckQueue(m.QueueId);
            if (err != null)
                return err;

            string mid = Guid.NewGuid().ToString();
            string payload = m.Payload;
            if (payload == null)
                payload = String.Empty;
            mc.Store(StoreMode.Set, mid, payload);

            mc.Store(StoreMode.Set, String.Format("{0}.visibility", mid), UnixTimestampNow);

            string keys = (string)mc.Get(m.QueueId);
            if ((keys == null) || (keys == String.Empty))
            {
                keys = mid;
            }
            else
            {
                keys = String.Format("{0},{1}", keys, mid);
            }
            mc.Store(StoreMode.Set, m.QueueId, keys);

            keys = (string)mc.Get(String.Format("{0}.new", m.QueueId));
            if ((keys == null) || (keys == String.Empty))
            {
                keys = mid;
            }
            else
            {
                keys = String.Format("{0},{1}", keys, mid);
            }
            mc.Store(StoreMode.Set, String.Format("{0}.new", m.QueueId), keys);

            m.Type = "response";
            m.MessageId = mid;

            return m;
        }
예제 #5
0
        private Nuxleus.Bucker.Message HandleListMessagesRequest(Nuxleus.Bucker.Message m)
        {
            Nuxleus.Bucker.Message err = CheckQueue(m.QueueId);
            if (err != null)
                return err;

            string qid = m.QueueId;

            m.Type = "response";
            //m.QueueId = m.QueueId;
            m.Op.Type = OperationType.ListMessages;

            string keys = (string)mc.Get(String.Format("{0}.new", m.QueueId));
            if ((keys == null) || (keys == String.Empty))
            {
                m.Messages = new string[0];
            }
            else
            {
                string[] unread = keys.Split(',');
                int count = 10;
                if (unread.Length < 10)
                {
                    count = unread.Length;
                }
                int index = 0;
                m.Messages = new string[count];
                foreach (string mid in unread)
                {
                    m.Messages[index] = mid;
                    index++;
                    if (index == 10)
                    {
                        break;
                    }
                }
            }

            return m;
        }
예제 #6
0
        private Nuxleus.Bucker.Message HandleListQueuesRequest(Nuxleus.Bucker.Message m)
        {
            string queues = (string)mc.Get(rootQueueId);
            if (queues == null)
                queues = String.Empty;
            string[] queuesList = queues.Split(',');

            Nuxleus.Bucker.Message lm = new Nuxleus.Bucker.Message();
            lm.Type = "response";
            lm.Op.Type = OperationType.ListQueues;
            if (queues == String.Empty)
            {
                lm.Queues = new string[0];
            }
            else
            {
                lm.Queues = new string[queuesList.Length];
                Array.Copy(queuesList, lm.Queues, queuesList.Length);
            }

            return lm;
        }
예제 #7
0
        private Nuxleus.Bucker.Message HandleDeleteQueueRequest(Nuxleus.Bucker.Message m)
        {
            Nuxleus.Bucker.Message err = CheckQueueId(m.QueueId);
            if (err != null)
                return err;

            string qid = m.QueueId;
            string keys = (string)mc.Get(qid);

            if ((keys != null) && (keys != String.Empty))
            {
                if (m.Op.Force == false)
                {
                    m = new Nuxleus.Bucker.Message();
                    m.Type = "error";
                    m.Op = null;
                    m.Error = new Nuxleus.Bucker.Error();
                    m.Error.Type = "queue-not-empty";
                    m.Error.Code = 400;
                    m.Error.Message = String.Format("'{0}' is not empty. Either delete all the messages first or set the force attribute on the 'op' element", qid);
                    return m;
                }
                else
                {
                    // Deleting all the messages attached to that queue
                    string[] keysList = keys.Split(',');
                    foreach (string key in keysList)
                    {
                        mc.Remove(String.Format("{0}.visibility", key));
                        mc.Remove(key);
                    }
                }
            }

            mc.Remove(qid);
            mc.Remove(String.Format("{0}.new", qid));

            string queues = (string)mc.Get(rootQueueId);
            if (queues == null)
                queues = String.Empty;
            if (queues.Contains(qid))
            {
                queues = queues.Replace(qid, "");
                queues = queues.Replace(",,", "");
                queues = queues.Trim(comma);
                mc.Store(StoreMode.Set, rootQueueId, queues);
            }

            m.Type = "response";
            return m;
        }
예제 #8
0
        private Nuxleus.Bucker.Message HandleNewQueueRequest(Nuxleus.Bucker.Message m)
        {
            Nuxleus.Bucker.Message err = CheckQueueId(m.QueueId);
            if (err != null)
                return err;

            string queues = (string)mc.Get(rootQueueId);
            if (queues == null)
            { // just in case
                queues = String.Empty;
            }

            if (!queues.Contains(m.QueueId))
            {
                //mc.Add(m.QueueId, String.Empty);
                //mc.Add(String.Format("{0}.new", m.QueueId), String.Empty);
                //if (queues == String.Empty) {
                //    queues = m.QueueId;
                //} else {
                //    queues = String.Format("{0},{1}", queues, m.QueueId);
                //}
                //mc.Set(rootQueueId, queues);
                m.Type = "response";
            }
            else
            {
                // Houston we have a conflict!
                string qid = m.QueueId;

                m = new Nuxleus.Bucker.Message();
                m.Type = "error";
                m.Op = null;
                m.Error = new Nuxleus.Bucker.Error();
                m.Error.Type = "conflict";
                m.Error.Code = 409;
                m.Error.Message = String.Format("'{0}' is already an existing queue", qid);
            }

            return m;
        }
예제 #9
0
        private void HandleMessageReceived ( Nuxleus.Bucker.Message m ) {
            // When a message is received we delete it from the queue as
            // it has no purpose anymore
            Nuxleus.Bucker.Message dm = new Nuxleus.Bucker.Message();
            dm.Op.Type = OperationType.DeleteMessage;
            dm.QueueId = m.QueueId;
            dm.MessageId = m.MessageId;
            Service.Connection.BeginSend(Nuxleus.Bucker.Message.Serialize(dm));

            LLUP.Notification n = LLUP.Notification.Parse(Convert.FromBase64String(m.Payload));
            postOffice.Post(n);
        }
예제 #10
0
 private void HandleListOfNewMessages ( Nuxleus.Bucker.Message m ) {
     if (m.Messages != null) {
         Nuxleus.Bucker.Message gm = new Nuxleus.Bucker.Message();
         gm.Op.Type = OperationType.GetMessage;
         gm.QueueId = m.QueueId;
         foreach (string mid in m.Messages) {
             gm.MessageId = mid;
             Service.Connection.BeginSend(Nuxleus.Bucker.Message.Serialize(gm));
         }
     }
 }