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