public void CancelaEncomenda(object aux) { ComunicacaoBD comunicacaoBD = new ComunicacaoBD(); WEBooksDistribuidorAp.LogMensagens text = new WEBooksDistribuidorAp.LogMensagens(); ComunicacaoFila comFila = new ComunicacaoFila(); string idEncomenda = EncomendaWEBooks.IdEncomenda; try { string ultimoEstado = servico.getEstado(idEncomenda, comunicacaoBD); if (ultimoEstado == "colocada" || ultimoEstado == "pendente") { servico.alteraEstado(idEncomenda, "cancelada", comunicacaoBD); //Espera 5 seg antes de responder a WEBooks Thread.Sleep(new TimeSpan(0, 0, 5)); EncomendaWEBooks.TipoMensagem = "cancelada"; comFila.escreveFilaWeb(EncomendaWEBooks); text.actualizaLog(EncomendaWEBooks.TipoMensagem, false); } else { comunicacaoBD.Transacao.Rollback(); throw new Exception("Erro: estado da encomenda nao permite que seja cancelada"); } } catch (SqlException es) { comunicacaoBD.Transacao.Rollback(); throw new Exception("ERRO: Nao é possivel Cancelar encomenda"); } comunicacaoBD.Transacao.Commit(); }
/// <summary> /// Thread que fica a escuta no fila de mensagens /// </summary> public void Receiver() { ComunicacaoFila comFila = new ComunicacaoFila(); while (true) { //Thread.Sleep(new TimeSpan(0,0,10)); System.Messaging.Message mensagem; try { mensagem = mqDist.Receive(new TimeSpan(0, 0, 3)); EncomendaWEBooks encomendaWEbooks = new EncomendaWEBooks((XmlDocument)mensagem.Body); //Envia para o log o tipo de mensagem que recebeu actualizaLog(encomendaWEbooks.TipoMensagem, true); if (encomendaWEbooks.TipoMensagem.ToLower() == "colocar") { WEBooksDistribuidorService servicoDistribuidor = new WEBooksDistribuidorService(); servicoDistribuidor.EncomendaWEBooks = encomendaWEbooks; WaitCallback EncomendaCallBack = new WaitCallback(servicoDistribuidor.TempoVidaEncomenda); ThreadPool.QueueUserWorkItem(EncomendaCallBack); actualizaLog(encomendaWEbooks.IdEncomenda, false); } else if (encomendaWEbooks.TipoMensagem.ToLower() == "cancelar") { WEBooksDistribuidorService servicoDistribuidor = new WEBooksDistribuidorService(); servicoDistribuidor.EncomendaWEBooks = encomendaWEbooks; WaitCallback CancelaCallBack = new WaitCallback(servicoDistribuidor.CancelaEncomenda); ThreadPool.QueueUserWorkItem(CancelaCallBack); } } catch { //nao faz nada, significa que nao existem mensagens na fila } } }
public void TempoVidaEncomenda(object aux) { WEBooksDistribuidorAp.LogMensagens text = new WEBooksDistribuidorAp.LogMensagens(); Encomenda encomenda = new Encomenda(EncomendaWEBooks); ComunicacaoFila comFila = new ComunicacaoFila(); InsereEncomenda(ref encomenda); //fica logo no estado colocada //Envia mensagem de aviso de mensagem colocada, na WEBooks fica pendente if (encomenda.TempoEspera != 0) { PendenteEncomenda(encomenda.IdEncomenda); //Espera 5 segundos antes de enviar a resposta a WEBooks EncomendaWEBooks.TipoMensagem = "pendente"; Thread.Sleep(new TimeSpan(0,0,5)); comFila.escreveFilaWeb(EncomendaWEBooks); text.escreveNoLog = "Enviada: " + EncomendaWEBooks.TipoMensagem; } Thread.Sleep(new TimeSpan(0, 0, encomenda.TempoEspera));//vai esperar que fiquem todos os livros disponiveis try { EncomendaWEBooks.TipoMensagem = "entregue"; Thread.Sleep(new TimeSpan(0, 0, 5)); comFila.escreveFilaWeb(EncomendaWEBooks); EntregueEncomenda(encomenda.IdEncomenda); text.actualizaLog(EncomendaWEBooks.TipoMensagem, false); } catch (Exception) { //nao faz nada, significa que mensagem foi cancelada anteriormente } //fim do tempo de vida da encomenda }