Arnaud Opalvens
Arnaud Opalvens

Reputation: 31

Listen to Advanced Oracle Queue (AQ)

I'm checking Go ability to migrate an existing C++ application. One of the main task is to listen actively (no polling) an Advanced Oracle Queue. In Java and C++ there are existing libraries supporting it since a long time.

I could not find anything similar in Go (libraries & examples). Could you help me with that?

Upvotes: 2

Views: 1741

Answers (1)

M1k3
M1k3

Reputation: 11

I have an implementation whereby I'm using the "gopkg.in/goracle.v2" package to connect to Oracle, along with the generic Go library "database/sql". The way I did it, I have the code to read from the AQ in a PL/SQL procedure which I'm calling from my Go code. Although this is not the best approach - and I'm actually going to change it so that it doesn't rely on a stored oracle procedure - it works. The code looks something like the following:

Oracle PL/SQL proc:

PROCEDURE GetAQMessage ( out_content    OUT VARCHAR2, in_acknowledge IN  VARCHAR2 DEFAULT 'N' )
IS 
   dyn_sql   VARCHAR2(32000);
   l_content VARCHAR2(4000);
BEGIN

   dyn_sql := '
      DECLARE 
         l_payload MESSAGE_TYPE := MESSAGE_TYPE (NULL);
         l_msg_id             RAW(16);
         l_dequeue_options    DBMS_AQ.DEQUEUE_OPTIONS_T;
         l_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T; 
      BEGIN
         DBMS_AQ.DEQUEUE(
            queue_name => '''|| v_queue_name ||''',
            dequeue_options => l_dequeue_options,
            message_properties => l_message_properties,
            payload => l_payload,
            msgid => l_msg_id
        );
        :b_output := l_payload.message;
      END;';

   EXECUTE IMMEDIATE dyn_sql USING OUT l_content;
   -- Return the content to the OUT parameter
   out_content := l_content;

   -- Permanently removes the message from the Queue
   IF in_acknowledge = 'Y' THEN
      COMMIT;
   END IF;

END GetAQMessage;

Go code:

func GetAQMessage(transaction *sql.Tx) (string, error) {
    var outResult string
    var resErr error
    var debug int

    configuration = conf.Read()

    //Run the command
    _, resErr = transaction.Exec(`BEGIN CONSENT.GETAQMESSAGE(:1,:2) ; END;`, sql.Out{Dest: &outResult}, "N")

    return outResult, resErr
}

Upvotes: 1

Related Questions