/// <summary> /// Abre o canal de callbacks com o Roteador e efetua a assinatura /// </summary> /// <param name="objectimpl"></param> private void _assinaCallbackRoteador(IRoteadorOrdensCallback objectimpl) { try { logger.Info("Chamando ativador para instanciar o cliente do roteador..."); gClienteRoteadorOrdens = Ativador.Get <IAssinaturasRoteadorOrdensCallback>(objectimpl); if (gClienteRoteadorOrdens != null) { logger.Info("Cliente do roteador instanciado, enviando request de assinatura..."); AssinarExecucaoOrdemResponse lResposta = gClienteRoteadorOrdens.AssinarExecucaoOrdens(new AssinarExecucaoOrdemRequest()); // Faz a chamada pra abrir a conexão com o roteador; só serve pra enviar o contexto, e o roteador assinar a ponte duplex if (lResposta.StatusResposta == Library.MensagemResponseStatusEnum.OK) { logger.Info("Conexão com o roteador aberta, resposta do servidor: [" + lResposta.StatusResposta + "] [" + lResposta.DescricaoResposta + "]"); // Abriu ok, solta o evento de mensagem } else { logger.Info("Conexão com o roteador aberta, resposta do servidor: [" + lResposta.StatusResposta + "] [" + lResposta.DescricaoResposta + "]"); // Erro na abertura de conexão; TODO: verificar protocolo de erro nesse caso gClienteRoteadorOrdens = null; // Setando como null pra tentar novamente depois, ver conforme o protocolo o que fazer } // Assina os status de conexao a bolsa para manter o canal aberto. AssinarStatusConexaoBolsaResponse resp = gClienteRoteadorOrdens.AssinarStatusConexaoBolsa(new AssinarStatusConexaoBolsaRequest()); _lastStatusBolsa = DateTime.Now.Ticks; } } catch (Exception ex) { logger.Error("Erro em _assinaCallbackRoteador():" + ex.Message, ex); } }
/// <summary> /// AssinarStatusConexaoBolsa - trata os pedidos de assinatura dos eventos de conexao e desconexao a bolsa /// </summary> /// <param name="request">obejto do tipo AssinarStatusConexaoBolsaRequest</param> /// <returns>objeto do tipo AssinarStatusConexaoBolsaResponse</returns> public AssinarStatusConexaoBolsaResponse AssinarStatusConexaoBolsa(AssinarStatusConexaoBolsaRequest request) { IRoteadorOrdensCallback subscriber = Ativador.GetCallback <IRoteadorOrdensCallback>(); logger.Debug("Recebeu pedido de assinatura de status de conexao: " + ((IContextChannel)subscriber).RemoteAddress.ToString()); lock (_exchangeStatusSubscribers) { _exchangeStatusSubscribers.Add(subscriber); } return(new AssinarStatusConexaoBolsaResponse()); }
/// <summary> /// AssinarExecutacaoOrdens - trata os pedidos de assinatura de eventos de execucao de ordens /// </summary> /// <param name="request">objeto do tipo </param> /// <returns></returns> public AssinarExecucaoOrdemResponse AssinarExecucaoOrdens(AssinarExecucaoOrdemRequest request) { IRoteadorOrdensCallback subscriber = Ativador.GetCallback <IRoteadorOrdensCallback>(); logger.Debug("Recebeu pedido de assinatura de ordens: " + ((IContextChannel)subscriber).RemoteAddress.ToString()); // Guarda a referencia do assinante na lista interna de // assinante lock ( _executionsReportsSubscribers ) { if (subscriber != null) { _executionsReportsSubscribers.Add(subscriber); } } // Envia as respostas de ordens ja recebidas para o assinante List <OrdemInfo> queuedInfos = null; lock (_orderReportInfo) { if (_orderReportInfo.Count > 0) { queuedInfos = _orderReportInfo.ToList(); } } //if ( queuedInfos != null && queuedInfos.Count > 0 ) //{ // logger.Info("Existem " + queuedInfos.Count + " msgs enfileiradas, encaminhando para assinante"); // ThreadPool.QueueUserWorkItem( // new WaitCallback( // delegate(object required) // { // foreach (OrdemInfo info in queuedInfos) // { // subscriber.OrdemAlterada(info); // _bOrdemInfoSent = true; // } // } // ) // ); //} return(new AssinarExecucaoOrdemResponse()); }