IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Daemon écoutant une queue Oracle


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2010
    Messages : 32
    Points : 21
    Points
    21
    Par défaut Daemon écoutant une queue Oracle
    Bien le bonjour,


    J'aimerais implémenter un daemon écoutant une queue Oracle, affichant chaque nouveau message reçu sur cette queue et enlevant le message de la queue après affichage.

    Particularité : ma queue fait partie d'une queue table avec multiple consumers.

    Je pensais faire tout cela à l'aide de l'API oracle.AQ mais il y a vraiment très peu de doc et encore moins d'exemples... Est-ce qu'il y a moyen de faire plus simple ou plus direct ?

    Merci d'avance !

    Le code SQL pour la création de la queue table TQ_AQ_INBOUND_FLOW :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    BEGIN
      SYS.DBMS_AQADM.DROP_QUEUE_TABLE
        (QUEUE_TABLE          =>        'MILDJU.TQ_AQ_INBOUND_FLOW');
    END;
    /
     
    BEGIN
      SYS.DBMS_AQADM.CREATE_QUEUE_TABLE
      (
        QUEUE_TABLE           =>        'MILDJU.TQ_AQ_INBOUND_FLOW'
       ,QUEUE_PAYLOAD_TYPE    =>        'SYS.AQ$_JMS_TEXT_MESSAGE'
       ,COMPATIBLE            =>        '10.0.0'
       ,STORAGE_CLAUSE        =>        '
                                         TABLESPACE TSPACE_001
                                         PCTUSED    0
                                         PCTFREE    10
                                         INITRANS   1
                                         MAXTRANS   255
                                         STORAGE    (
                                                     INITIAL          64K
                                                     NEXT             1M
                                                     MINEXTENTS       1
                                                     MAXEXTENTS       UNLIMITED
                                                     PCTINCREASE      0
                                                     BUFFER_POOL      DEFAULT
                                                    )'
       ,SORT_LIST             =>        'ENQ_TIME'
       ,MULTIPLE_CONSUMERS    =>         TRUE
       ,MESSAGE_GROUPING      =>         0
       ,SECURE                =>         FALSE
       );
    END;
    /
    Et celui de la queue à écouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    BEGIN
      SYS.DBMS_AQADM.STOP_QUEUE ( QUEUE_NAME => 'MILDJU.AQ_INBOUND_FLOW');
      SYS.DBMS_AQADM.DROP_QUEUE ( QUEUE_NAME => 'MILDJU.AQ_INBOUND_FLOW');
    END;
    /
     
    BEGIN
      SYS.DBMS_AQADM.CREATE_QUEUE
      (
        QUEUE_NAME          =>   'MILDJU.AQ_INBOUND_FLOW'
       ,QUEUE_TABLE         =>   'MILDJU.TQ_AQ_INBOUND_FLOW'
       ,QUEUE_TYPE          =>   SYS.DBMS_AQADM.NORMAL_QUEUE
       ,MAX_RETRIES         =>   5
       ,RETRY_DELAY         =>   0
       ,RETENTION_TIME      =>   0
       );
    END;
    /
     
    BEGIN
      SYS.DBMS_AQADM.START_QUEUE
      (
        QUEUE_NAME => 'MILDJU.AQ_INBOUND_FLOW'
       ,ENQUEUE => TRUE 
       ,DEQUEUE => TRUE 
       );
    END;
    /

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2010
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Toujours pas de réponse, mais j'ai bossé aussi un peu de mon côté...

    J'ai trouvé quelques exemples sur le site d'Oracle mais à l'exécution, j'obtiens un code d'erreur JMS-174 (Class must be specified for queues with object payloads) et je ne sais pas pourquoi cela ne fonctionne pas.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    public void toto() throws MildjuException {
        AQSession aq_sess = null;
        AQQueueTable q_table;
        AQQueue queue;
        AQMessage message;
        AQRawPayload raw_payload;
        AQDequeueOption deq_option;
        byte[] b_array;
        Connection db_conn  = null;
     
        try {
            aq_sess = createSession();
     
            db_conn = ((AQOracleSession)aq_sess).getDBConnection();
     
            // Get a handle to queue table - TQ_AQ_INBOUND_FLOW in MILDJU schema
            q_table = aq_sess.getQueueTable("MILDJU", "TQ_AQ_INBOUND_FLOW");
            System.out.println("Successful getQueueTable");  
     
            // Get a handle to a queue - AQ_INBOUND_FLOW in MILDJU schema
            queue = aq_sess.getQueue("MILDJU", "AQ_INBOUND_FLOW");
            System.out.println("Successful getQueue");  
     
            // Creating a AQDequeueOption object with default options
            deq_option = new AQDequeueOption();
     
            // Dequeue a message
            message = queue.dequeue(deq_option);
            System.out.println("Successful dequeue"); 
     
            // Retrieve raw data from the message
            raw_payload = message.getRawPayload();
     
            b_array = raw_payload.getBytes();
     
            System.out.println("Le message : " + b_array.toString());
     
            db_conn.commit();
        } catch (Exception e) {
            throw new MildjuException(e.getMessage());
        }
    }
     
     
    public static AQSession createSession() {
        Connection db_conn;
        AQSession  aq_sess = null;
     
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            db_conn = DriverManager.getConnection("jdbc:oracle:thin:@mamachine:1918:MA_BASE", "MILDJU", "MILDJU");
     
            System.out.println("JDBC Connection opened "); 
            db_conn.setAutoCommit(false);
     
            // Load the Oracle AQ driver
            Class.forName("oracle.AQ.AQOracleDriver");
     
            // Creating an AQ Session
            aq_sess = AQDriverManager.createAQSession(db_conn);
            System.out.println("Successfully created AQSession ");  
        } catch (Exception ex) {
            System.out.println("Exception: " + ex); 
            ex.printStackTrace();      
        }
     
        return aq_sess;
    }
    et le message d'erreur :
    JDBC Connection opened
    Successfully created AQSession
    Successful getQueueTable
    Successful getQueue
    =ERROR 24 Feb 13:16:07 - JMS-174: Class must be specified for queues with object payloads
    Use dequeue(deq_option, payload_fact) or dequeue(deq_option, sql_data_cl)

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2010
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Vu que tout le monde semble s'y intéresser , je vais vous dire comment j'ai finalement pu y arriver. J'ai abandonné l'API oracle.AQ pour utiliser la javax.jms.

    En gros, j'ai créé une TopicConnection à partir duquel j'ai créé une TopicSession, à partir duquel j'ai créé un Topic basé sur le nom de ma queue.

    Ensuite, j'ai ajouté mon propre subscriber pour recevoir les messages. L'astuce, dans mon cas, était d'utiliser un durable subscriber permettant de récupérer tous les messages déjà présents sur la queue (et tous ceux qui doivent arriver par la suite).

    Ne pas oublier le commit à la fin pour consommer le message.

    Merci de votre attention, à vous les studios !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JMS] Acces Queue dans une base oracle 10G
    Par seddik_saber dans le forum Java EE
    Réponses: 1
    Dernier message: 29/04/2008, 16h00
  2. erreur au lancement d'une req Oracle (SP2-0552)
    Par etham dans le forum Administration
    Réponses: 5
    Dernier message: 16/04/2004, 16h23
  3. Réponses: 4
    Dernier message: 03/03/2004, 11h04
  4. Tranfert de données d'une base Oracle vers PostGre
    Par Elois dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 27/01/2004, 18h08
  5. [Tomcat]Connexion à une DataSource Oracle
    Par iceman dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 04/08/2003, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo