Fault tolerant connections allow another SonicMQ Broker to take over if the original SonicMQ Broker fails. To ensure message delivery, use the fault-tolerant APIs to setup and enable fault tolerance. These APIs include the setFaultTolerant procedure, the getFaultTolerant function, the isFaultTolerant function, the setConnectionURLs procedure, the setFaultTolerantReconnectTimeout procedure, the getFaultTolerantReconnectTimeout function, the setInitialConnectionTimeout procedure, the getInitialConnectionTimeout function, the setClientTransactionBufferSize procedure, the getClientTransactionBufferSize function, and the createChangeStateConsumer procedure. Although you setup and enable fault tolerance from the SonicMQ client, the SonicMQ Broker must support it.

Note: Fault tolerance is only available to OpenEdge clients running in ClientConnect and ServerConnect.

After creating the session object, you must create the list of SonicMQ Brokers to use, set the fault tolerant property for the session, and then start the session.

Fault tolerance set up

The following example shows how to set up a fault tolerant session.

DEFINE VARIABLE hSession AS HANDLE NO-UNDO.
RUN jms/jmssession.p PERSISTENT SET hSession ("-SMQConnect").
RUN setConnectionURLs IN hSession ("Primary:2508,BackupServer:9876").
RUN setFaultTolerant IN hSession(TRUE).
RUN beginSession IN hSession.

Example of a "ChangeState" handler (optional)

When the connection to the SonicMQ Broker is lost, SonicMQ has the ability to notify the application. A special asynchronous handler, "ChangeState" handler, notifies the client application whenever the state of the SonicMQ Broker changes. The character header property of the message passed to the "ChangeState" handler contains one of the following values: active, reconnecting, failed, or closed. You setup the handler by calling the createChangeStateConsumer procedure after to calling the beginSession procedure.

The following code sample shows how to use the createChangeStateConsumer procedure.

RUN createChangeStateConsumer IN hSession
  (THIS-PROCEDURE, "msgHandler", OUTPUT hMessage).
PROCEDURE msgHandler:
  DEFINE INPUT PARAMETER hMessage     AS HANDLE NO-UNDO.
  DEFINE INPUT PARAMETER hMsgConsumer AS HANDLE NO-UNDO.
  DEFINE OUTPUT PARAMETER hReply      AS HANDLE NO-UNDO.
  DEFINE VARIABLE cValue AS CHARACTER NO-UNDO.
  /* cValue will be "active", "reconnecting", "failed", or "closed" */
  cValue = DYNAMIC-FUNCTION("getCharProperty" IN hMessage, "state").
  DISPLAY cValue. 
  RUN deleteMessage IN hMessage.
END PROCEDURE.