public List <WordBank> AddWordsToQueue(List <WordBank> words, WikiSession aSession) { for (var i = 0; i < words.Count(); i++) { var wbId = words[i].WordBankId; var cached = _dbContext.WikiPages.FirstOrDefault(x => x.WordBankId == wbId); if (cached != null) { continue; } var wordBank = _dbContext.WordBanks.FirstOrDefault(x => x.WordBankId == wbId); var wbq = new WordBankQueue { CreatedDate = DateTime.Now, IsProcessed = false, WordBankId = wbId, WordBank = wordBank }; _dbContext.WordBankQueues.Add(wbq); _dbContext.SaveChanges(); _dbContext.Entry(wbq).Reload(); wbq = RabbitHelper.Send(wbq, aSession); //Send items to RabbitMQ for processing words[i] = wbq.WordBank; words[i].WordBankQueues.Add(wbq); } return(words); }
public static WordBankQueue Send(WordBankQueue queueItem, WikiSession aSession) { WordBankQueue aQueueItem = null; bool processed = false; var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "wiki_surf_dev", durable: false, exclusive: false, autoDelete: false, arguments: null); var consumer = new EventingBasicConsumer(channel); var props = channel.CreateBasicProperties(); var correlationId = Guid.NewGuid().ToString(); var replyQueue = channel.QueueDeclare().QueueName; props.CorrelationId = correlationId; props.ReplyTo = replyQueue; consumer.Received += (model, ea) => { var body = ea.Body.ToArray(); var response = Encoding.UTF8.GetString(body); if (ea.BasicProperties.CorrelationId == correlationId) { using (StreamReader sr = new StreamReader(new MemoryStream(body))) { aQueueItem = JsonConvert.DeserializeObject <WordBankQueue>(sr.ReadToEnd()); } Console.WriteLine(response); processed = true; } }; var json = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new { queueItem.WordBankId, queueItem.WordBankQueueId, queueItem.CreatedDate, queueItem.IsProcessed, queueItem.ProcessedDate, queueItem.WordBank.Word, aSession.WikiSessionId })); channel.BasicPublish(exchange: "", routingKey: "wiki_surf_dev", basicProperties: props, body: json); Console.WriteLine(" [x] Sent WordBankQueueId: {0} Word: {1}", queueItem.WordBankQueueId, queueItem.WordBank.Word); while (!processed) { Thread.Sleep(1000); var reply = channel.BasicConsume(replyQueue, true, consumer); } return(aQueueItem); } }