You are on page 1of 11

Advanced Queuing

AQ uses database structures as a repository for asynchronous queuing as an element in various Oracle-oriented and heterogeneous operations. Oracle features utilising Advanced Queuing include:

Oracle Data Guard Oracle Streams

In Oracle Data Guard primary databases the queue monitor process (often running as qmn0) interacts with AQ. As of Oracle release 9.2, AQ comes bundled with Standard Edition and Enterprise Edition at no extra cost. As of Oracle release 10.1, AQ is integrated into Oracle Streams, and is called "Oracle Streams AQ". Oracle AQ is used as the internal Java Message Service provider in the Oracle Enterprise Service Bus. In addition to asynchronous message exchanges (point-to-point and Publish/subscribe), Oracle AQ can also perform message transformation via SQL functions.

Web-based business applications communicate with each other, producer applications enqueue messages and consumer applications dequeue messages. Advanced Queuing provides databaseintegrated message queuing functionality.AQ leverages functionality of oracle databases and stores the messages persistently propagated between queues on different machines/dbs and transmitted using oracle net services(HTTPS/SMTP) Advanced queuing takes advantage of IDAP(Internet Data Access presentation) which defines message structure using XML.Internet Data Access Presentation (IDAP) is the SOAP specification for AQ operations. IDAP defines the XML message structure for the body of the SOAP request. An IDAP-structured message is transmitted over the Internet using transport protocols such as HTTP or SMTP.Using IDAP, AQ operations such as enqueue, dequeue, notification, and propagation can be executed using standard Internet transport protocols--HTTP(S) and SMTP. Third-party clients, including third-party messaging vendors, can also interoperate with AQ over the Internet using Messaging Gateway. IDAP messages can be requests, responses, or an error response. An IDAP document sent from an AQ client contains an attribute for designating the remote operation; that is, enqueue, dequeue, or register accompanied by operational data.

you can perform Advanced Queuing operations over the Internet using transport protocols such as HTTP, HTTPS, or SMTP. In this case, the client, a user or Internet application, produces structured XML messages. During propagation over the Internet, Oracle servers communicate using structured XML also.

The transformation is represented by a SQL function that takes the source data type as input and returns an object of the target data type.

XMLType Payloads You can create queues that use the new opaque type, XMLType. These queues can be used to transmit and store messages that are XML documents. Using XMLType, you can do the following: Store any type of message in a queue Store documents internally as CLOBs Store more than one type of payload in a queue Query XMLType columns using the operators ExistsNode() and SchemaMatch() Specify the operators in subscriber rules or dequeue conditions

shows the architecture for performing AQ operations over HTTP. The major components are: The AQ client program The Web server/ServletRunner hosting the AQ servlet The Oracle database server The AQ client program sends XML messages (conforming to IDAP) to the AQ servlet, which understands the XML message and performs AQ operations. Any HTTP client, for example Web browsers, can be used. The Web server/ServletRunner hosting the AQ servlet interprets the incoming XML messages. Examples include Apache/Jserv or Tomcat. The AQ servlet connects to the Oracle database server and performs operations on the users' queues. Figure 1-5 Architecture for Performing AQ Operations Using HTTP

nterfaces to Advanced Queuing

You can access Advanced Queuing functionality through the following interfaces: PL/SQL using DBMS_AQ, DBMS_AQADM, and DBMS_AQELM. Visual Basic using Oracle Objects for OLE. Refer to the Online Help for Oracle Objects for OLE. Java using the oracle.AQ Java package. Java Message Service (JMS) using the oracle.jms Java package. Internet access using HTTP, HTTPS, and SMTP

The Internet Data Access Presentation (IDAP) The Internet Data Access Presentation (IDAP) uses the Content-Type of text/xml to specify the body of the SOAP request. XML provides the presentation for IDAP request and response messages as follows: All request and response tags are scoped in the SOAP namespace. AQ operations are scoped in the IDAP namespace. The sender includes namespaces in IDAP elements and attributes in the SOAP body. The receiver processes IDAP messages that have correct namespaces; for the requests with incorrect namespaces, the receiver returns an invalid request error. The SOAP namespace has the value http://schemas.xmlsoap.org/soap/envelope/ The IDAP namespace has the value http://ns.oracle.com/AQ/schemas/access

AQ contains message which contains control info(metadata) and payload(data).The control information represents message properties used by AQ to manage messages. The payload data is the information stored in the queue and is transparent to Oracle AQ. A message can reside in only one queue. A message is created by the enqueue call and consumed by the dequeue call.A queue is a repository for messages. There are two types of queues: user queues, also known as normal queues,

and exception queues. The user queue is for normal message processing. Messages are transferred to an exception queue if they cannot be retrieved and processed for some reason. Queues can be created, altered, started, stopped, and dropped by using the Oracle AQ administrative interfaces. user queues can be persistent or nonpersistent queues.Persistent queues store messages in database tables. These queues provide all the reliability and availability features of database tables. Nonpersistent queues store messages in memory. They are generally used to provide an asynchronous mechanism to send notifications to all users that are currently connected. Queue Table Queues are stored in queue tables. Each queue table is a database table and contains one or more queues. Each queue table contains a default exception queue. Agent An agent is a queue user. This can be an end user or an application. There are two types of agents: Producers who place messages in a queue (enqueuing) Consumers who retrieve messages (dequeuing) Any number of producers and consumers may be accessing the queue at a given time. Agents insert messages into a queue and retrieve messages from the queue by using the Oracle AQ operational interfaces. An agent is identified by its name, address and protocol. The name of the agent may be the name of the application or a name assigned by the application. A queue may itself be an agent--enqueuing or dequeuing from another queue. The address field is a character field of up to 1024 bytes that is interpreted in the context of the protocol. For instance, the default value for the protocol is 0, signifying a database link addressing. In this case, the address for this protocol is of the form queue_name@dblink q where queue_name is of the form [schema.]queue and dblink may either be a fully qualified database link name or the database link name without the domain name. Recipient The recipient of a message may be specified by its name only, in which case the recipient must dequeue the message from the queue in which the message was enqueued. The recipient may be specified by name and an address with a protocol value of 0. The address should be the name of another queue in the same database or another Oracle database (identified by the database link) in which case the message is propagated to the specified queue and can be dequeued by a consumer with the specified name. If the recipient's name is NULL, the message is propagated to the specified queue in the address and can be dequeued by the subscribers of the queue specified in the address. If the protocol field is nonzero, the name and address are not interpreted by the system and the message can be dequeued by a special consumer

Programmatic Environments for Accessing AQ The following programmatic environments are used to access the Advanced Queuing functions of Oracle: Native AQ Interface PL/SQL (DBMS_AQADM and DBMS_AQ packages): supports administrative and operational functions C (OCI): supports operational functions Visual Basic (OO4O): supports operational functions Java (oracle.AQ package using JDBC): supports administrative and operational functions JMS Interface to AQ Java (javax.jms and oracle.jms packages using JDBC): supports the standard JMS administrative and operational functions and Oracle JMS extensions XML Interface to AQ The AQ XML servlet supports operational functions using an XML message format. AQ XML Servlet oracle.AQ.xml.AQxmlServlet using HTTP or SMTP Using the AQ XML Servlet to Access AQ You can use the AQ XML servlet to access Oracle9i AQ over HTTP using Simple Object Access Protocol (SOAP) and an XML message format called Internet Data Access Presentation (IDAP). Using the AQ servlet, a client can perform the following actions: Send messages to single-consumer queues Publish messages to multiconsumer queues/topics Receive messages from queues Register to receive message notifications The servlet can be created by defining a Java class that extends the oracle.AQ.xml.AQxmlServlet or oracle.AQ.xml.AQxmlServlet20 class. These classes in turn extend the javax.servlet.http.HttpServlet class. The servlet can be deployed on any Web server or ServletRunner that implements Javasoft's Servlet 2.0 or Servlet 2.2 interfaces. To deploy the AQ Servlet with a Web server that implements Javasoft's Servlet2.0 interfaces, you must define a class that extends the oracle.AQ.xml.AQxmlServle20 class. To deploy the AQ Servlet with a Web server that implements Javasoft's Servlet2.2

interfaces, you must define a class that extends the oracle.AQ.xml.AQxmlServlet class. The servlet can be compiled using JDK 1.1.x or JDK 1.2.x libraries. For JDK 1.1.x the CLASSPATH must contain: $ORACLE_HOME/jdbc/lib/classes111.jar $ORACLE_HOME/jlib/jta.jar $ORACLE_HOME/jdbc/lib/nls_charset11.jar $ORACLE_HOME/jlib/jndi.jar $ORACLE_HOME/lib/lclasses11.zip $ORACLE_HOME/lib/xmlparserv2.jar $ORACLE_HOME/lib/xschema.jar $ORACLE HOME/rdbms/jlib/aqapi11.jar $ORACLE_HOME/rdbms/jlib/jmscommon.jar $ORACLE_HOME/rdbms/jlib/aqxml.jar $ORACLE_HOME/rdbms/jlib/xsu111.jar $ORACLE_HOME/lib/servlet.jar For JDK 1.2.x the CLASSPATH must contain: $ORACLE_HOME/jdbc/lib/classes12.jar $ORACLE_HOME/jlib/jta.jar $ORACLE_HOME/jdbc/lib/nls_charset12.jar $ORACLE_HOME/jlib/jndi.jar $ORACLE_HOME/lib/lclasses12.zip $ORACLE_HOME/lib/xmlparserv2.jar $ORACLE_HOME/lib/xschema.jar $ORACLE_HOME/rdbms/jlib/aqapi.jar $ORACLE_HOME/rdbms/jlib/jmscommon.jar $ORACLE_HOME/rdbms/jlib/aqxml.jar $ORACLE_HOME/rdbms/jlib/xsu12.jar $ORACLE_HOME/lib/servlet.jar Since the servlet uses JDBC OCI drivers to connect to the Oracle9i database server, the 9i Oracle client libraries must be installed on the machine that hosts the servlet. The LD_LIBRARY_PATH must contain $ORACLE_HOME/lib. Modeling Queue Entities Basic Queuing Basic Queuing Illustrated AQ Client-Server Communication Multiconsumer Dequeuing of the Same Message Dequeuing of Specified Messages by Specified Recipients AQ Implementation of Workflows AQ Implementation of Publish/Subscribe Message Propagation Propagation and Advanced Queuing

Creating a queue table for queues containing messages of XMLType execute dbms_aqadm.create_queue_table( queue_table comment => 'OS_orders_pr_mqtab', => 'Overseas Shipping MultiConsumer Orders queue table',

multiple_consumers => TRUE, queue_payload_type => 'SYS.XMLType', compatible => '8.1');

Enqueue Using the AQ XML Servlet You can perform enqueue requests over the Internet using IDAP. See Chapter 17, "Internet Access to Advanced Queuing" for more information on sending AQ requests using IDAP. Scenario In the BooksOnLine application, a customer can request: FedEx shipping (priority 1), Priority air shipping (priority 2). or Regular ground shipping (priority 3). The Order Entry application uses a priority queue to store booked orders. Booked orders are propagated to the regional booked orders queues. At each region, orders in these regional booked orders queues are processed in the order of the shipping priorities. The following calls create the priority queues for the Order Entry application.

PL/SQL (DBMS_AQADM Package): Example Code /* Create a priority queue table for OE: */ EXECUTE dbms_aqadm.create_queue_table( \ queue_table => 'OE_orders_pr_mqtab', \ sort_list =>'priority,enq_time', \ comment => 'Order Entry Priority \ MultiConsumer Orders queue table',\ multiple_consumers => TRUE, \ queue_payload_type => 'BOLADM.order_typ', \ compatible => '8.1', \ primary_instance => 2, \ secondary_instance => 1); EXECUTE dbms_aqadm.create_queue ( \ queue_name => 'OE_bookedorders_que', \ queue_table => 'OE_orders_pr_mqtab'); Assume that a customer, John, wants to send an enqueue request using SOAP. The XML message will have the following format. <?xml version="1.0"?> <Envelope xmlns= "http://schemas.xmlsoap.org/soap/envelope/"> <Body> <AQXmlSend xmlns = "http://ns.oracle.com/AQ/schemas/access"> <producer_options> <destination>OE.OE_bookedorders_que</destination> </producer_options> <message_set> <message_count>1</message_count> <message> <message_number>1</message_number> <message_header> <correlation>ORDER1</correlation> <priority>1</priority> <sender_id> <agent_name>john</agent_name> </sender_id> </message_header> <message_payload> <ORDER_TYP> <ORDERNO>100</ORDERNO>

<STATUS>NEW</STATUS> <ORDERTYPE>URGENT</ORDERTYPE> <ORDERREGION>EAST</ORDERREGION> <CUSTOMER> <CUSTNO>1001233</CUSTNO> <CUSTID>JOHN</CUSTID> <NAME>JOHN DASH</NAME> <STREET>100 EXPRESS STREET</STREET> <CITY>REDWOOD CITY</CITY> <STATE>CA</STATE> <ZIP>94065</ZIP> <COUNTRY>USA</COUNTRY> </CUSTOMER> <PAYMENTMETHOD>CREDIT</PAYMENTMETHOD> <ITEMS> <ITEMS_ITEM> <QUANTITY>10</QUANTITY> <ITEM> <TITLE>Perl handbook</TITLE> <AUTHORS>Randal</AUTHORS> <ISBN>345620200</ISBN> <PRICE>19</PRICE> </ITEM> <SUBTOTAL>190</SUBTOTAL> </ITEMS_ITEM> <ITEMS_ITEM> <QUANTITY>10</QUANTITY> <ITEM> <TITLE>JDBC guide</TITLE> <AUTHORS>Taylor</AUTHORS> <ISBN>123420212</ISBN> <PRICE>59</PRICE> </ITEM> <SUBTOTAL>590</SUBTOTAL> </ITEMS_ITEM> </ITEMS> <CCNUMBER>NUMBER01</CCNUMBER> <ORDER_DATE>08/23/2000 12:45:00</ORDER_DATE> </ORDER_TYP> </message_payload> </message> </message_set> <AQXmlCommit/> </AQXmlSend> </Body>

</Envelope> Dequeue Using the AQ XML Servlet You can perform dequeue requests over the Internet using SOAP. See Chapter 17, "Internet Access to Advanced Queuing" for more information on receiving AQ messages using SOAP. In the BooksOnline scenario, assume that the East shipping application receives AQ messages with a correlation identifier 'RUSH' over the Internet. The dequeue request will have the following format: <?xml version="1.0"?> <Envelope xmlns= "http://schemas.xmlsoap.org/soap/envelope/"> <Body> <AQXmlReceive xmlns = "http://ns.oracle.com/AQ/schemas/access"> <consumer_options> <destination>ES_ES_bookedorders_que</destination> <consumer_name>East_Shipping</consumer_name> <wait_time>0</wait_time> <selector> <correlation>RUSH</correlation> </selector> </consumer_options> <AQXmlCommit/> </AQXmlReceive> </Body> </Envelope> Registering for Notifications Using the AQ XML Servlet Clients can register for AQ notifications over the Internet. See Chapter 17, "Internet Access to Advanced Queuing" for more information on registering for AQ notifications using SOAP. The register request has the following format: ?xml version="1.0"?> <Envelope xmlns= "http://schemas.xmlsoap.org/soap/envelope/"> <Body> <AQXmlRegister xmlns = "http://ns.oracle.com/AQ/schemas/access"> <register_options> <destination>WS.WS_BOOKEDORDERS_QUE</destination>

<consumer_name>BOOKED_ORDERS</consumer_name> <notify_url>mailto://john@company.com</notify_url> </register_options> <AQXmlCommit/> </AQXmlRegister> </Body> </Envelope> The e-mail notification sent to john@company.com will have the following format: <?xml version="1.0"?> <Envelope xmlns="http://www.oracle.com/schemas/IDAP/envelope"> <Body> <AQXmlNotification xmlns="http://www.oracle.com/schemas/AQ/access"> <notification_options> <destination>WS.WS_BOOKEDORDERS_QUE</destination> </notification_options> <message_set> <message> <message_header> <message_id>81128B6AC46D4B15E03408002092AA15</message_id> <correlation>RUSH</correlation> <priority>1</priority> <delivery_count>0</delivery_count> <sender_id> <agent_name>john</agent_name> </sender_id> <message_state>0</message_state> </message_header> </message> </message_set> </AQXmlNotification> </Body> </Envelope> http://docs.oracle.com/cd/B10500_01/appdev.920/a96587/qintnet.htm#141421

http://docs.oracle.com/cd/B10500_01/appdev.920/a96587/qsample.htm#83406

You might also like