8
votes

Oracle avancé en file d'attente avec .NET

Quelqu'un sait comment mettre en œuvre la file d'attente Oracle Advance de C # à l'aide de PL / SSQL et ODP.NET? Je ne trouve pas d'exemple unique ou de ressource avec des exemples concrets en C # ou VB.NET. Idéalement, j'aimerais quelques exemples sur la manière dont les messages Enqueue et Dequeu avec types simples (XML / String).


0 commentaires

5 Réponses :


0
votes

AQ a une interface PLSQL via DBMS_AQ [ADM]. Tout ce dont vous avez besoin est de gérer ce forfait de votre environnement et des exemples et de configuration de AQ communs. Je ne pense pas qu'il y a quelque chose de spécial lorsque vous appelez ces forfaits de C #.


2 commentaires

Désolé mais que je dois utiliser PL / SQL et les procédures stockées sont une partie intégrante de la question. Le problème est que lors de la déséquilibre des messages de nombreuses options sont disponibles par ex. le délai de connexion de la connexion. De plus, UDT sont utilisés comme paramètre pour le Proc - Je ne sais pas comment créer UDT de .net avec 10g. Ce que je cherche, quels sont quelques exemples de codes C # et de meilleures pratiques (par exemple, fermez la connexion DB ou laissez-la ouverte ???)


Est-ce que quelqu'un a un exemple à ce sujet? Je cherche aussi cela. ;)



3
votes

Je ne connais pas la réponse exacte à ce problème, mais voici ce que nous avons fait:

  • Tout d'abord, chaque application .NET à écouter sur l'ESB (ESB est la construction sur AQ) doit utiliser ses propres messages locaux Oracle DB et DEQUENE à partir de là. Les messages sont propagés aux files d'attente locales. Cela résout le problème potentiel d'évolutivité liée à la maintenance d'une connexion DB ouverte pour recevoir des messages.
  • Deuxièmement, nous avons construit notre propre bibliothèque AQ qui encapsuler des procédures stockées de manière générale. - Ceci n'est plus nécessaire que Oracle a finalement publié une odac 11.1.0.7.20 (avec un ODP.NET qui prend en charge AQ). Nous utilisons des types Oracle comme une sorte de DTO pour définir les contrats de messages.

1 commentaires

La 2ème option est ce que j'ai fait pour déroger. Intéressant de voir qu'ils ont ajouté un soutien approprié dans .net via odp.net.



19
votes

Je ne peux pas vous aider avec les meilleures pratiques, mais je peux vous aider avec une file d'attente UDT. Avant de traiter la file d'attente, vous devez générer des types personnalisés de la base de données dans votre projet C #. En supposant que vous avez installé Visual Studio et ODP.NET, vous devez simplement vous connecter à la base de données via l'Explorateur de serveur, localiser votre UDTS, cliquez avec le bouton droit de la souris et choisissez «Générer la classe personnalisée ...» Ces classes Carte directement sur vos UDT et sont utilisées Pour stocker les informations déséquilibrées.

Voici un exemple du code que vous utiliseriez pour enquisser un message: p> xxx pré>

C'est un processus similaire à DEQUUE: P>

private void main(string[] args)
{
    string _connstring = "Data Source=host/DB;User
    Id=USER;Password=PASSWORD1;";

    OracleConnection _connObj = new OracleConnection(_connstring);

    // Create a new queue object
    OracleAQQueue _queueObj = new OracleAQQueue("UDT_NAME", _connObj);

    // Set the payload type to your UDT
    _queueObj.MessageType = OracleAQMessageType.Udt;
    _queueObj.UdtTypeName = "UDT_NAME";

    _connObj.Open();

    OracleTransaction _txn = _connObj.BeginTransaction();

    // Dequeue the message.
    _queueObj.DequeueOptions.Visibility = OracleAQVisibilityMode.OnCommit;
    _queueObj.DequeueOptions.Wait = 10;
    OracleAQMessage _deqMsg = _queueObj.Dequeue();

    UDT_CUSTOM_CLASS data = (UDT_CUSTOM_CLASS)_deqMsg.Payload;

    // At this point, you have the data and can do whatever you need to do with it

    _txn.Commit();
    _queueObj.Dispose();
    _connObj.Close();
    _connObj.Dispose();
    _connObj = null;

}


1 commentaires

Au cas où n'importe qui apparaît sur cette question, veuillez conscienter que le pilote ODP.NET, non exploité n'est pris en charge sur VS2019. Vous devrez installer VS2017 et 12.2 pour obtenir l'option fournisseur de données dans l'explorateur de serveur. Ce n'est qu'alors que vous pouvez générer automatiquement la classe UDT. 3 jours gaspillés. C'est Oracle pour vous.



2
votes

1 commentaires

Les liens ne fonctionnent plus. Pour cette raison, il est généralement préférable de contourner également les pièces pertinentes de votre réponse avec le lien, de sorte que les informations ne deviennent pas indisponibles lorsque le lien cesse de fonctionner à l'avenir.



3
votes

J'ai eu une exigence dans laquelle je devais en faire enticulée / déquendez des messages UDT à une file d'attente. Ce message était vraiment utile. Il a presque tout, mais la création d'un «type personnalisé Oracle» est manquante. Je pensais que sa valeur ajout de ce code ici afin que la solution soit complète.

en Enqueue / dequeue dans Oracle: P>

Utilisateur avec rôle "AQ_ADMInistrator_role" doit être créé. Dans l'exemple ci-dessous, le "AQUSER" est créé avec ce rôle. P>

PL Sql to EnQueue:

DECLARE
    queue_options       DBMS_AQ.ENQUEUE_OPTIONS_T;
    message_properties  DBMS_AQ.MESSAGE_PROPERTIES_T;
    message_id          RAW(16);
    my_message          AQUSER.USER_DEFINED_TYPE;
BEGIN
    my_message := AQUSER.USER_DEFINED_TYPE('XXX','YYY','ZZZ');
    DBMS_AQ.ENQUEUE(
        queue_name => 'AQUSER.QUEUE_NAME',
        enqueue_options => queue_options,
        message_properties => message_properties,
        payload => my_message,
        msgid => message_id);
    COMMIT;
END;
/ 

PL SQL to DeQueue

DECLARE
    queue_options       DBMS_AQ.DEQUEUE_OPTIONS_T;
    message_properties  DBMS_AQ.MESSAGE_PROPERTIES_T;
    message_id          RAW(2000);
    my_message          AQUSER.USER_DEFINED_TYPE;
BEGIN
    DBMS_AQ.DEQUEUE(
        queue_name => 'AQUSER.QUEUE_NAME',
        dequeue_options => queue_options,
        message_properties => message_properties,
        payload => my_message,
        msgid => message_id );
    COMMIT;
END;
/

-------------------------------------------------------------------------------------------

To create a Oracle Custom Type, you can use the following code:

    public class CustomMessageType : IOracleCustomType, INullable
    {

        [OracleObjectMappingAttribute("XXXXX")]
        public string XXXXX { get; set; }

        [OracleObjectMappingAttribute("YYYYY")]
        public string YYYYY { get; set; }

        [OracleObjectMappingAttribute("ZZZZZ")]
        public string ZZZZZ { get; set; }

        public void FromCustomObject(Oracle.DataAccess.Client.OracleConnection con, IntPtr pUdt)
        {
            if (!string.IsNullOrEmpty(XXXXX))
            {
                OracleUdt.SetValue(con, pUdt, "XXXXX", XXXXX);
            }
            if (!string.IsNullOrEmpty(YYYYY))
            {
                OracleUdt.SetValue(con, pUdt, "YYYYY", YYYYY);
            }
            if (!string.IsNullOrEmpty(ZZZZZ))
            {
                OracleUdt.SetValue(con, pUdt, "ZZZZZ", ZZZZZ);
            }
        }

        public void ToCustomObject(Oracle.DataAccess.Client.OracleConnection con, IntPtr pUdt)
        {
            XXXXX  = (string)OracleUdt.GetValue(con, pUdt, "XXXXX");
            YYYYY = (string)OracleUdt.GetValue(con, pUdt, "YYYYY");
            ZZZZZ = (string)OracleUdt.GetValue(con, pUdt, "ZZZZZ");
        }

        public bool IsNull { get; set; }

    }


    [OracleCustomTypeMappingAttribute("SCHEMA.CUSTOM_TYPE")]
    public class QueueMessageTypeFactory : IOracleCustomTypeFactory
    {
        public IOracleCustomType CreateObject()
        {
            return new CustomMessageType();
        }
    }


1 commentaires

Puis-je obtenir plus de détails sur cette implémentation comme où sont appelées ces procédures stockées