martes, 12 de enero de 2010

Queues y Blobs

Después de leerme documentos y estudiar ejemplos, incorporamos de los blobs y colas (queues), como almacén de datos y comunicación entre el WebRole y el WorkerRole.

En nuestro programa, se crea una cola donde, por cada tipo de modelRoot del archivo xml recivido por el cliente, se obtiene su nombre y se introduce como mensaje. El WorkerRole contiene un bucle esperando a que la cola creada en el WebRole tenga un mensaje, para así empezar la generación del asset específico. Para que saber que no hay que generar más assets, el último mensaje introducido en la cola tiene como texto "end".
Se crea otra cola de en el WorkerRole que tiene la misma función que la anterior pero en la otra dirección, en la cual los mensajes son las clases generadas.

El blob que creamos únicamente se utiliza para almacenar el archivo xml que recibe el WebRole como MemoryStream. El WorkerRole lo utilizará para descargar su contenido.


public void SendQueue(ModelRoot modelRoot)

        {

            //Create Queue for send ModelClass

            QueueStorage qStore = QueueStorage.Create(StorageAccountInfo.GetDefaultQueueStorageAccountFromConfiguration());

            var q = qStore.GetQueue("radarcsend");

            if (!q.DoesQueueExist())

            {

                q.CreateQueue();

            }



            foreach (ModelType type in modelRoot.Types)

            {

                ModelClass modelClass = type as ModelClass;

                if (modelClass != null)

                {

                    //Write modelClass to queue

                    q.PutMessage(new Message(modelClass.Name));



                }

            }

            q.PutMessage(new Message("end"));

        }




public override void Start()

        {

            QueueStorage qStore = QueueStorage.Create(StorageAccountInfo.GetDefaultQueueStorageAccountFromConfiguration());

            

            //Cola lectora

            RoleManager.WriteToLog("Information", "Worker Process entry point called");

            var queue = qStore.GetQueue("radarcsend");

            if (!queue.DoesQueueExist())

                queue.CreateQueue();

            else

                queue.Clear();

            //Cola escritora

            var queueWrite = qStore.GetQueue("radarcreceive");

            if (!queueWrite.DoesQueueExist())

                queueWrite.CreateQueue();

            else

                queueWrite.Clear();



            String stringClass = null;



            while (true)

            {

                Thread.Sleep(10);

                Message message = queue.GetMessage();

                

                if (message != null)

                {

                    string messageString = message.ContentAsString();

                    if (messageString != null)

                    {

                        if (messageString == "end")

                        {

                            queueWrite.PutMessage(new Message("end"));

                            queue.DeleteMessage(message);

                        }

                        else

                        {

                            if (modelRoot == null)

                                modelRoot = ReadModelRoot();



                            if (modelRoot != null)

                            {

                                queue.DeleteMessage(message);

                                stringClass = SearchAndCreate(modelRoot, messageString);

                                queueWrite.PutMessage(new Message(stringClass));

                            }

                        }

                    }

                }

            }

            

  

        }




public List<string> WaitResultQueue()

        {

            List<string> result = null;

            QueueStorage qStore = QueueStorage.Create(StorageAccountInfo.GetDefaultQueueStorageAccountFromConfiguration());

            var queue = qStore.GetQueue("radarcreceive");

            if (!queue.DoesQueueExist())

            {

                queue.CreateQueue();

            }

            Message message = null;

            while (true)

            {

                Thread.Sleep(100);

                message = queue.GetMessage();

                if (message != null)

                {  

                    string messageString = message.ContentAsString();

                    if (messageString != null)

                    {

                        if (messageString == "end")

                        {

                            break;

                        }

                        else

                        {

                            result.Add(messageString);

                            queue.DeleteMessage(message);

                        }

                    }

                }

            }

            queue.DeleteMessage(message);

            queue.DeleteQueue();

            return result;

        }




public void StorageBlob(MemoryStream streamModelRoot)

        {

            streamModelRoot.Position = 0;

            //Create Container for Blob

            StorageAccountInfo account = StorageAccountInfo.GetDefaultBlobStorageAccountFromConfiguration();

            BlobStorage storage = BlobStorage.Create(account);

            BlobContainer container = storage.GetBlobContainer(@"radarc");

            container.CreateContainer(null, ContainerAccessControl.Public);



            //Create Blob for storage ModelRoot

            string uniqueBlobName = "radarcblob";

            BlobProperties prop = new BlobProperties(uniqueBlobName);

            prop.ContentType = "ModelRoot";

            

            BlobContents blob = new BlobContents(streamModelRoot);

            container.CreateBlob(prop, blob, true);

            //RoleManager.WriteToLog("Information", string.Format("Uploaded blob {0} as {1}", fileName, uniqueBlobName));

            prop = container.GetBlobProperties(uniqueBlobName);

            



        }



public ModelRoot ReadModelRoot()

        {

            //Create Container for Blob

            StorageAccountInfo account = StorageAccountInfo.GetDefaultBlobStorageAccountFromConfiguration();

            BlobStorage storage = BlobStorage.Create(account);

            BlobContainer container = storage.GetBlobContainer(@"radarc");

            container.CreateContainer(null, ContainerAccessControl.Public);

            

            string uniqueBlobName = "radarcblob";

            if (container.DoesBlobExist(uniqueBlobName))

            {

                //Read Blob

                BlobProperties prop = new BlobProperties(uniqueBlobName);

                prop.ContentType = "ModelRoot";

                BlobContents blob = new BlobContents(new MemoryStream());



                prop = container.GetBlob(uniqueBlobName, blob, false);



                MemoryStream memoryStream = blob.AsStream as MemoryStream;

                byte[] txt = memoryStream.GetBuffer();

                char[] chars=Encoding.UTF8.GetChars(txt);

                string models=new string(chars);

                if (memoryStream.Length == 0)

                    return null;



                Type[] types = { typeof(Microsoft.VisualStudio.Modeling.Diagrams.CoreDesignSurfaceDomainModel), typeof(BusinessEntitiesDSLDomainModel) };

                Microsoft.VisualStudio.Modeling.Store store = new Microsoft.VisualStudio.Modeling.Store(types);

                ModelRoot modelR = null;

                memoryStream.Position = 0;

                using (Transaction t = store.TransactionManager.BeginTransaction())

                {

                    modelR = BusinessEntitiesDSLSerializationHelper.Instance.LoadModel(store, memoryStream, null, null);

                    t.Commit();

                }

                return modelR;

            }

            return null;

        }


Saludos

No hay comentarios:

Publicar un comentario