| Oracle9i Application Developer's Guide - Advanced Queuing Release 1 (9.0.1) Part Number A88890-02 |
|
Creating Applications Using JMS , 4 of 9
In the point-to-point model, clients exchange messages using queues - from one point to another. These queues are used by message producers and consumers to send and receive messages.
An administrator creates single-consumer queues by means of the createQueue method in AQjmsSession. A client may obtain a handle to a previously created Queue using the getQueue method on AQjmsSession.
These queues are described as Single-Consumer Queues because a message can be consumed by only a single consumer. Put another way: a message can be consumed exactly once. This raises the question: What happens when there are multiple processes or operating system threads concurrently dequeuing from the same queue? Since a locked message cannot be dequeued by a process other than the one that has created the lock, each process will dequeue the first unlocked message at the head of the queue.
Before using a queue, the queue needs to be enabled for enqueue/dequeue using start call in AQjmsDestination.
After processing, the message is removed if the retention time of the queue is 0, or is retained for a specified retention time. As long as the message is retained, it can be either
QueueBrowser and specifying the message ID of the processed message.
A client uses a QueueSender to send messages to a Queue. A QueueSender is created by passing a Queue to a session's createSender method. A client also has the option of creating a QueueSender without supplying a Queue. In that case a Queue must be specified on every send operation.
A client can specify a default delivery mode, priority and time-to-live for all messages sent by the QueueSender. Alternatively, the client can define these options on a per message basis.
In the BooksOnline application, new orders are to be sent to the new_orders_queue. After creating a JMS connection and session, we create a sender:
public void enqueue_new_orders(QueueSession jms_session, BolOrder new_order) { QueueSender sender; Queue queue; ObjectMessage obj_message; try { /* get a handle to the new_orders queue */ queue = ((AQjmsSession) jms_session).getQueue("OE", "OE_neworders_que"); sender = jms_session.createSender(queue); obj_message = jms_session.createObjectMessage(); obj_message.setJMSCorrelationID("RUSH"); obj_message.setObject(new_order); sender.send(obj_message); jms_session.commit(); } catch (JMSException ex) { System.out.println("Exception: " + ex); } }
A client uses a QueueReceiver to receive messages from a queue. A QueueReceiver is created using the session's createQueueReceiver method. A QueueReceiver can be created with a message selector. This allows the client to restrict messages delivered to the consumer to those that match the selector.
The selector for queues containing payloads of type TextMessage, StreamMessage, BytesMessage, ObjectMessage, MapMessage can contain any expression that has a combination of one or more of the following:
JMSMessageID ='ID:23452345' to retrieve messages that have a specified message ID (all message IDs being prefixed with ID:)
JMSPriority < 3 AND JMSCorrelationID = 'Fiction' JMSCorrelationID LIKE 'RE%'
color IN ('RED', BLUE', 'GREEN') AND price < 30000
For queues containing AdtMessages the selector must be a SQL expression on the message payload contents or message ID or priority or correlation ID.
msgid = '23434556566767676'
Note: in this case message IDs must NOT be prefixed with 'ID:'
priority < 3 AND corrid = 'Fiction'
tab.user_data.color = 'GREEN' AND tab.user_data.price < 30000
In the BOL application, new orders are retrieved from the new_orders_queue. These orders are then published to the OE.OE_bookedorders_topic. After creating a JMS connection and session, you create a receiver to receive messages:
public void get_new_orders(QueueSession jms_session) { QueueReceiver receiver; Queue queue; ObjectMessage obj_message; BolOrder new_order; BolCustomer customer; String state; String cust_name; try { /* get a handle to the new_orders queue */ queue = ((AQjmsSession) jms_session).getQueue("OE", "OE_neworders_que"); receiver = jms_session.createReceiver(queue); for(;;) { /* wait for a message to show up in the queue */ obj_message = (ObjectMessage)receiver.receive(10); new_order = (BolOrder)obj_message.getObject(); customer = new_order.getCustomer(); state = customer.getState(); obj_message.clearBody(); /* determine customer region and assign a shipping region*/ if((state.equals("CA")) || (state.equals("TX")) || (state.equals("WA")) || (state.equals("NV"))) obj_message.setStringProperty("Region", "WESTERN"); else obj_message.setStringProperty("Region", "EASTERN"); cust_name = new_order.getCustomer().getName(); obj_message.setStringProperty("Customer", cust_name); if(obj_message.getJMSCorrelationID().equals("RUSH")) book_rush_order(obj_message); else book_new_order(obj_message); jms_session.commit(); } } catch (JMSException ex) { System.out.println("Exception: " + ex); } }
A client uses a QueueBrowser to view messages on a queue without removing them. The browser methods return a java.util.Enumeration that is used to scan the queue's messages. The first call to nextElement gets a snapshot of the queue. A QueueBrowser may also optionally lock messages as it is scanning them. This is similar to a "SELECT ... for UPDATE" command on the message. This prevents other consumers from removing the message while they are being scanned.
A QueueBrowser can also be created with a message selector. This allows the client to restrict messages delivered to the browser to those that match the selector.
The selector for queues containing payloads of type TextMessage, StreamMessage, BytesMessage, ObjectMessage, MapMessage can contain any expression that has a combination of one or more of the following:
JMSMessageID ='ID:23452345' to retrieve messages that have a specified message ID (all message IDs being prefixed with ID:)
JMSPriority < 3 AND JMSCorrelationID = 'Fiction' JMSCorrelationID LIKE 'RE%'
color IN ('RED', BLUE', 'GREEN') AND price < 30000
For queues containing AdtMessages the selector must be a SQL expression on the message payload contents or messageID or priority or correlationID.
msgid = '23434556566767676'
Note: in this case message IDs must NOT be prefixed with 'ID:'
priority < 3 AND corrid = 'Fiction'
tab.user_data.color = 'GREEN' AND tab.user_data.price < 30000
In the BooksOnline application, new orders are put into the new_orders_queue. A client can then browse selected messages.
public void browse_rush_orders(QueueSession jms_session) { QueueBrowser browser; Queue queue; ObjectMessage obj_message; BolOrder new_order; Enumeration messages; String customer_name; try { /* get a handle to the new_orders queue */ queue = ((AQjmsSession) jms_session).getQueue("OE", "OE_neworders_que"); /* create a Browser to look at RUSH orders in USA */ browser = jms_session.createBrowser(queue, "JMSCorrelationID = 'RUSH' and country = 'USA' "); for (messages = browser.getEnumeration() ; messages.hasMoreElements() ;) { obj_message = (ObjectMessage)messages.nextElement(); new_order = (BolOrder)obj_message.getObject(); customer_name = new_order.getCustomer().getName(); System.out.println("Customer " + customer_name + " has placed a RUSH order"); } browser.close(); } catch (Exception ex) { System.out.println("Exception " + ex); } }
|
|
![]() Copyright © 1996-2001, Oracle Corporation. All Rights Reserved. |
|