Re: [Orclib-users] subscriptions/callback for Oracle AQ
Open source C and C++ library for accessing Oracle Databases
Brought to you by:
vince_del_paris
From: vincent r. <vin...@gm...> - 2012-12-05 17:39:31
|
Hi, In fact, I prefer to not use an OCI_Event as all other fields (database, datetime, etc....) won't be available..... That would be messy ! Thus, what i proposed does not make sense. As the goal is to implement async dequeuing i prefer proposing another design. What do you think about the following : * OCI_DequeueEnableAsync(port, timeout) * OCI_DequeueDisableAsync(void) * OCI_DequeueGetStartAsync(oci_dequeue *, async callback) * OCI_DequeueGetStopAsync(oci_dequeue *) Where async callback prototype woulb be like: void callback(oci_dequeue*, oci_msg*) Thus no public subscription (it would be internal). Just call to enable/disable program wide aq notification. Then you provide a callback that gets msg object. I find it smooth. It may need to support more than one central notification... Vincent -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 hi Vincent, yes, it makes perfect sense to me. I'm looking forward to it! p. On 12/5/12 9:07 AM, vincent rogier wrote: > Hi, > > > About coding, this is a secondary easy task that required only just few lines of code. > I'm more focused on how to integrate to OCILIB. > Is the following mock-up all right for you ? > > > #include "ocilib.h" > > #ifdef _WINDOWS > #define sleep(x) Sleep(x*1000) > #endif > > #define PORT 5468 > #define TIMEOUT 0 > > void event_handler(OCI_Event *event); > void error_handler(OCI_Error *err); > > int main(void) > { > OCI_Connection *con; > OCI_Subscription *sub; > OCI_Dequeue *deq1; > OCI_Dequeue *deq2; > > OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT | OCI_ENV_EVENTS | OCI_ENV_THREADED); > > con = OCI_ConnectionCreate("db", "usr", "pwd", OCI_SESSION_DEFAULT); > sub = OCI_SubscriptionRegister(con, "SUB-MSG", OCI_CNT_MESSAGE, event_handler, PORT, TIMEOUT); > inf = OCI_TypeInfoGet(con, "MY_MESSAGE", OCI_TIF_TYPE); > deq1 = OCI_DequeueCreate(inf, "MY_QUEUE"); > deq2 = OCI_DequeueCreate(inf, "MY_QUEUE"); > > OCI_DequeueSetConsumer(deq1, "CONSUMER1"); > OCI_DequeueSetConsumer(deq2, "CONSUMER2"); > > OCI_SubscriptionAddDequeue(sub, deq1); > OCI_SubscriptionAddDequeue(sub, deq2); > > sleep(MAX_INT); > > OCI_DequeueFree(deq1); > OCI_DequeueFree(deq2); > OCI_SubscriptionUnregister(sub); > OCI_ConnectionFree(con); > > OCI_Cleanup(); > > return EXIT_SUCCESS; > } > > void error_handler(OCI_Error *err) > { > printf("*** error : %s\n", OCI_ErrorGetString(err)); > } > > void event_handler(OCI_Event *event) > { > OCI_Dequeue *deq = OCI_EventGetDequeue(event); > OCI_Msg *msg = OCI_DequeueGet(deq); > > /* process payload */ > } > > > > On Tue, Dec 4, 2012 at 8:57 PM, Petr Vaněk <pe...@ya... <mailto:pe...@ya...> <pe...@ya...>> wrote: > > OCI_SubscriptionAddDequeue > > > > > -- > Vincent Rogier -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with undefined - http://www.enigmail.net/ iQEcBAEBAgAGBQJQvwGAAAoJEC8yRjM4uE2t7MwH/iYJyM13uHjr7pEYewQJ+cLV 5iYQTyB6RrD5TCVDXyid9KB55AVHHtef4yr24HDkMTxAit0D+ayP3T51EqV7ojuf ncqMR895TJMleK01+NSy9W0jzevj81/K8Tia3QO6QdXJd7EPNHiBY0m2EYJaTPbI AY1H47IKTWadMs2VCEuvV5zMzTf/RP7765FpKB/91/+Tm14A6A4SUY1QRc9mLRJ2 +vCy6UU8MXhEngKmFUKB+ZBte7YB8GdxrNeStM2vIHTYuRqYEgvzZLmU3oIwubw6 kOSOy1evKLuXNqe9DxbIwfMdE2T1DMvEtryLGUrHLG3UR35r5LwkhIW7Fp00VD8= =vGEd -----END PGP SIGNATURE----- |