Pergunta

Nós temos uma solução TIBCO EMS que usos built-in failover de servidor em um ambiente de 2-4 servidor. Se os administradores TIBCO fail-over serviços de um servidor EMS para outro, as conexões devem ser transferidos para o novo servidor automaticamente no nível de serviço EMS. Para os nossos aplicativos C # usando o serviço EMS, isso não está acontecendo -. Nossos conexões de usuários não estão sendo transferidos para o novo servidor após failover e não temos certeza porque

Nossa conexão aplicativo para EMS na inicialização somente assim se os admins TIBCO failover depois que os usuários começaram a nossa aplicação, que os usuários precisam para reiniciar o aplicativo, a fim de reconectar para o novo servidor (a nossa conexão EMS usa uma string servidor, incluindo todos os 4 servidores EMS produção -. Se a primeira tentativa falhar, ele se move para o próximo servidor na string e tenta de novo)

Eu estou procurando uma abordagem automatizada que irá tentar se reconectar a EMS periodicamente se detectar que a conexão está morto, mas eu não tenho certeza a melhor forma de fazer isso.

Todas as idéias? Estamos usando TIBCO.EMS.dll versão 4.4.2 e .Net 2.x (SmartClient app)

Qualquer ajuda seria apreciada.

Foi útil?

Solução

Este post deve resumir as minhas observações atuais e explicar a minha abordagem em mais detalhe ...

A TIBCO 'ConnectionFactory' e tipos 'conexão' são pesado, tipos de thread-safe. TIBCO sugere que você mantenha o uso de um ConnectionFactory (por servidor configurado de fábrica) e um Conexão por fábrica.

O servidor também aparece para ser responsável por failover in-place 'Connection' e re-conexão, então vamos confirmar que está fazendo o seu trabalho e, em seguida, inclinar-se sobre esse recurso.

Criando uma solução do lado do cliente vai ser um pouco mais envolvido do que a fixação de um problema de configuração do servidor ou cliente. Todas as sessões que tenha criado a partir de uma necessidade de conexão falhou a ser re-criado (para não mencionar os produtores, consumidores e destinos). Não há "reconexão" ou métodos de "refresh" de cada tipo. As sessões não manter uma referência a sua ligação pai também.

Você terá que gerenciar uma pesquisa de conexão objetos / sessão e ir nozes inicializar re-todos! ou implementar algum tipo de manipulador de evento de falha de sessão que pode obter a nova conexão e reconectá-los.

Assim, por agora, vamos cavar e ver se o cliente está configurado para receber a notificação failover (TIB ems usuários guia pg 292). E certifique-se a exceção levantada é capturado, contém a URL failover, e está sendo tratada adequadamente.

Outras dicas

Primeiro, sim, eu estou respondendo a minha própria pergunta. É importante notar, entretanto, que sem ajmastrean, eu estaria em lugar nenhum. muito obrigado!

ONE: ConnectionFactory.SetReconnAttemptCount, SetReconnAttemptDelay, SetReconnAttemptTimeout deve ser ajustado apropriadamente. Eu acho que os valores padrão re-experimentar muito rapidamente (na ordem de 1/2 segundo entre tentativas). servidores Nossa EMS pode levar um longo tempo para failover por causa de armazenamento de rede, etc -. modo 5 repetições com intervalos de 1 / 2s é nem de longe o suficiente

DOIS: Eu acredito que é importante para permitir que os batimentos cardíacos cliente-servidor e servidor-cliente. não foi capaz de verificar, mas sem aqueles no lugar, o cliente não pode obter a notificação de que o servidor está offline ou a mudança no modo failover. Isto, naturalmente, é uma configuração do lado do servidor para o EMS.

TRÊS: você pode assistir para evento de failover, definindo Tibems.SetExceptionOnFTSwitch (true); e, em seguida, fiação até um manipulador de eventos exceção. Quando em um ambiente de servidor único, você verá uma "conexão foi finalizada" mensagem. No entanto, se você estiver em um ambiente multi-servidor tolerante a falhas, você verá o seguinte: "Connection tem realizado interruptor tolerante a falhas para". Você não precisa estritamente esta notificação, mas pode ser útil (especialmente em testes).

QUATRO: Aparentemente, não está claro na documentação EMS, conexão reconexão não vai funcionar em um ambiente de servidor único. Você precisa estar em um multi-servidor, falha ambiente tolerante. Existe um truque, no entanto. Você pode colocar o mesmo servidor na lista de conexões duas vezes -. Estranho eu sei, mas ele funciona e permite que a lógica interna reconexão ao trabalho

algum código:

private void initEMS()
{
    Tibems.SetExceptionOnFTSwitch(true);
    _ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>);
    _ConnectionFactory.SetReconnAttemptCount(30);       // 30retries
    _ConnectionFactory.SetReconnAttemptDelay(120000);   // 2minutes
    _ConnectionFactory.SetReconnAttemptTimeout(2000);   // 2seconds
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>);
    _Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler);
}
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args)
{
    EMSException e = args.Exception;
    // args.Exception = "Connection has been terminated" -- single server failure
    // args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server
    MessageBox.Show(e.ToString());
}

Os aplicativos cliente pode receber uma notificação de um failover, definindo a propriedade sistema tibco.tibjms.ft.switch.exception

Talvez as necessidades da biblioteca que ao trabalho?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top