Domanda

Abbiamo una soluzione TIBCO EMS che utilizza il failover del server integrato in un ambiente server 2-4. Se TIBCO amministra i servizi di failover da un server EMS a un altro, le connessioni dovrebbero essere trasferite automaticamente al nuovo server a livello di servizio EMS. Per le nostre applicazioni C # che utilizzano il servizio EMS, ciò non accade: le nostre connessioni utente non vengono trasferite al nuovo server dopo il failover e non siamo sicuri del perché.

La nostra applicazione si connette a EMS solo all'avvio, quindi se TIBCO ammette il failover dopo che gli utenti hanno avviato la nostra applicazione, gli utenti devono riavviare l'app per riconnettersi al nuovo server (la nostra connessione EMS utilizza una stringa del server che include tutti e 4 server EMS di produzione: se il primo tentativo fallisce, passa al server successivo nella stringa e riprova).

Sto cercando un approccio automatizzato che tenterà di riconnettersi periodicamente a EMS se rileva che la connessione è interrotta ma non sono sicuro del modo migliore per farlo.

Qualche idea? Stiamo utilizzando TIBCO.EMS.dll versione 4.4.2 e .Net 2.x (app SmartClient)

Qualsiasi aiuto sarebbe apprezzato.

È stato utile?

Soluzione

Questo post dovrebbe riassumere i miei commenti attuali e spiegare il mio approccio in modo più dettagliato ...

I tipi TIBCO 'ConnectionFactory' e 'Connection' sono tipi pesanti e sicuri per il thread. TIBCO suggerisce di mantenere l'uso di una ConnectionFactory (per fabbrica configurata dal server) e una connessione per fabbrica.

Anche il server appare responsabile del failover e della riconnessione 'Connessione' sul posto, quindi confermiamo che sta facendo il suo lavoro e quindi appoggiamoci su quella funzione.

La creazione di una soluzione lato client sarà leggermente più complicata rispetto alla risoluzione di un problema di installazione del server o del client. Tutte le sessioni create da una connessione non riuscita devono essere ricreate (per non parlare di produttori, consumatori e destinazioni). Non ci sono " riconnetti " o " aggiorna " metodi su entrambi i tipi. Le sessioni non mantengono nemmeno un riferimento alla loro connessione principale.

Dovrai gestire una ricerca degli oggetti connessione / sessione e inizializzare nuovamente tutti! o implementare una sorta di gestore di eventi di errore di sessione in grado di ottenere la nuova connessione e riconnetterli.

Quindi, per ora, scaviamo e vediamo se il client è configurato per ricevere una notifica di failover (guida utenti tib ems pag. 292). E assicurati che l'eccezione sollevata sia rilevata, contenga l'URL di failover e sia gestita correttamente.

Altri suggerimenti

Prima di tutto, sì, sto rispondendo alla mia domanda. È importante notare, tuttavia, che senza ajmastrean, non sarei da nessuna parte. grazie mille!

ONE: ConnectionFactory.SetReconnAttemptCount, SetReconnAttemptDelay, SetReconnAttemptTimeout deve essere impostato in modo appropriato. Penso che i valori predefiniti riprovino troppo rapidamente (nell'ordine di 1/2 secondo tra i tentativi). I nostri server EMS possono impiegare molto tempo a eseguire il failover a causa dell'archiviazione di rete, ecc. Quindi 5 tentativi a intervalli di 1 / 2s non sono abbastanza lunghi.

DUE: Credo sia importante abilitare i battiti cardiaci client-server e server-client. Non è stato in grado di verificare ma senza quelli in atto, il client potrebbe non ricevere la notifica che il server è offline o che passa in modalità di failover. Questa, ovviamente, è un'impostazione lato server per EMS.

TRE: puoi guardare per evento di failover impostando Tibems.SetExceptionOnFTSwitch (true); e quindi cablare un gestore eventi di eccezione. Quando ci si trova in un ambiente a server singolo, vedrai una "Connessione terminata" Messaggio. Tuttavia, se ti trovi in ??un ambiente multi-server a tolleranza d'errore, vedrai questo: "Connessione ha eseguito il passaggio a tolleranza d'errore su". Non è strettamente necessaria questa notifica, ma può essere utile (specialmente nei test).

QUATTRO: Apparentemente non chiaro nella documentazione EMS, la riconnessione della connessione NON funzionerà in un ambiente a server singolo. È necessario trovarsi in un ambiente multi-server, tollerante ai guasti. C'è un trucco, tuttavia. Puoi inserire lo stesso server nell'elenco di connessioni due volte - strano lo so, ma funziona e consente alla logica di riconnessione integrata di funzionare.

del codice:

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());
}

Le applicazioni client possono ricevere notifiche di un failover impostando la proprietà di sistema tibco.tibjms.ft.switch.exception

Forse la biblioteca ha bisogno che funzioni?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top