첫째로, 예, 내 질문에 대답하고 있습니다. 그러나 ajmastrean이 없다면 아무 것도 없을 것입니다. 정말 고맙습니다!
하나 : ConnectionFactory.SetReconnAttemptCount, SetReconnAttemptDelay, SetReconnAttemptTimeout을 적절하게 설정해야합니다. 나는 기본값이 너무 빨리 재 시도 (재시도 사이에서 1/2 초 정도)한다고 생각한다.우리의 EMS 서버는 네트워크 스토리지 등으로 인해 장애 조치에 긴 시간이 걸릴 수 있습니다. 따라서 1/2s 간격으로 5 회 재시도가 충분히 길지 않습니다.
TWO : 저는 클라이언트 - 서버 및 서버 - 클라이언트 하트 비트를 사용하는 것이 중요하다고 생각합니다. 확인할 수는 있지만 위치에없는 경우 클라이언트가 서버가 오프라인 상태이거나 장애 조치 모드로 전환되었다는 알림을받지 못할 수 있습니다. 이것은 물론 EMS의 서버 측 설정입니다.
THREE : Tibems.SetExceptionOnFTSwitch (true)를 설정하여 장애 조치 이벤트를 볼 수 있습니다. 그런 다음 예외 이벤트 핸들러를 연결합니다. 단일 서버 환경에서 "연결이 종료되었습니다."라는 메시지가 나타납니다. 그러나 내결함성이있는 다중 서버 환경에있는 경우 "연결에서 내결함성 스위치를 수행했습니다"라고 표시됩니다. 이 알림은 엄격하게 필요하지 않지만 유용 할 수 있습니다 (특히 테스트 할 때).
FOUR : EMS 설명서에서 분명히 명확하지 않은 연결 단일 서버 환경에서 연결 재 연결이 작동하지 않습니다. 다중 서버, 내결함성 환경에 있어야합니다. 그러나 트릭이 있습니다. 이상하게도 동일한 서버를 연결 목록에 두 번 넣을 수는 있지만 작동하고 내장 된 다시 연결 논리를 사용할 수 있습니다.
일부 코드 :
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());
}
어떻게 현재 내결함성을 구현? 'factories.conf'파일의 서버에 있습니까? 'url'속성에 134 페이지의 'tib_ems_dotnet_ref.pdf'에 지정된 URL의 쉼표로 구분 된 목록이 있습니까? –
예, 그렇습니다, 믿거 나 말거나 문제입니다. EMS 서버가 페일 오버 될 때 한 서버에서 다른 서버로 연결이 전송되어야합니다. 연결 문자열에 EMS 서버의 구분 된 목록이있을 때 작동해야하지만 작동하지 않는 EMS.lib의 버그가 있다고 생각합니다. – ScottCher
수신기에서 장애 조치 (failover) 후 오류가 발생합니까? (메시지를 보낼 때) 제작자가 장애 조치 한 후에 오류가 발생합니까? 대부분의 경우 라이브러리에서 다시 연결해야합니다. 연결 문자열에 여러 서버를 제공하면 연결하는 동안 라운드 로빈이 가능해집니다. 나중에는 ... – TheSoftwareJedi