📄 transactedexample.java
字号:
/* * @(#)TransactedExample.java 1.3 00/08/18 * * Copyright (c) 2000 Sun Microsystems, Inc. All Rights Reserved. * * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, * modify and redistribute this software in source and binary code form, * provided that i) this copyright notice and license appear on all copies of * the software; and ii) Licensee does not utilize the software in a manner * which is disparaging to Sun. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * * This software is not designed or intended for use in on-line control of * aircraft, air traffic, aircraft navigation or aircraft communications; or in * the design, construction, operation or maintenance of any nuclear * facility. Licensee represents and warrants that it will not use or * redistribute the Software for such purposes. */import java.util.*;import javax.jms.*;/** * The TransactedExample class demonstrates the use of transactions in a JMS * application. It represents a highly simplified eCommerce application, in * which the following things happen: * * <pre> * Legend * R - Retailer * V - Vendor * S - Supplier * O - Order Queue * C - Confirmation Queue * ()- Thread * []- Queue * * 2(b) 3 * 1 2(a) /+------->[S1 O]<-----------(S1) * /+-->[V O]<----+ / | * / \ / 3 | * / \ / 5 v------------------+ * (R) ( V )-------->[V C] 4 * \ / \ ^------------------+ * \ / \ | * \ 7 6 / \ | * +---->[R C]<--+ \ 2(c) 4 | * +------->[SN O]<-----------(SN) * </pre> * * <ol> * <li>A retailer sends a message to the vendor order queue ordering a quantity * of computers. It waits for the vendor's reply. * <li>The vendor receives the retailer's order message and places an order * message into each of its suppliers' order queues, all in one transaction. * This JMS transaction combines one synchronous receive with multiple sends. * <li>One supplier receives the order from its order queue, checks its * inventory, and sends the items ordered to the order message's replyTo * field. If it does not have enough in stock, it sends what it has. * The synchronous receive and the send take place in one JMS transaction. * <li>The other supplier receives the order from its order queue, checks its * inventory, and sends the items ordered to the order message's replyTo * field. If it does not have enough in stock, it sends what it has. * The synchronous receive and the send take place in one JMS transaction. * <li>The vendor receives the replies from the suppliers from its confirmation * queue and updates the state of the order. Messages are processed by an * asynchronous message listener; this step illustrates using JMS transactions * with a message listener. * <li>When all outstanding replies are processed for a given order, the vendor * sends a message notifying the retailer whether or not it can fulfill the * order. * <li>The retailer receives the message from the vendor. * </ol> * <p> * The program contains five classes: Retailer, Vendor, GenericSupplier, * VendorMessageListener, and Order. It also contains a main method and a * method that runs the threads of the Retail, Vendor, and two supplier classes. * <p> * All the messages use the MapMessage message type. Synchronous receives are * used for all message reception except for the case of the vendor processing * the replies of the suppliers. These replies are processed asynchronously * and demonstrate how to use transactions within a message listener. * <p> * All classes except Retailer use transacted sessions. * <p> * The program uses five queues. Before you run the program, create the * queues and name them A, B, C, D and E. * <p> * When you run the program, specify on the command line the number of * computers to be ordered. * * @author Kim Haase * @author Joseph Fialli * @version 1.3, 08/18/00 */public class TransactedExample { public static String vendorOrderQueueName = null; public static String retailerConfirmationQueueName = null; public static String monitorOrderQueueName = null; public static String storageOrderQueueName = null; public static String vendorConfirmationQueueName = null; public static int exitResult = 0; /** * The Retailer class orders a number of computers by sending a message * to a vendor. It then waits for the order to be confirmed. * <p> * In this example, the Retailer places two orders, one for the quantity * specified on the command line and one for twice that number. * <p> * This class does not use transactions. * * @author Kim Haase * @author Joseph Fialli * @version 1.3, 08/18/00 */ public static class Retailer extends Thread { int quantity = 0; /** * Constructor. Instantiates the retailer with the quantity of * computers being ordered. * * @param q the quantity specified in the program arguments */ public Retailer(int q) { quantity = q; } /** * Runs the thread. */ public void run() { QueueConnectionFactory queueConnectionFactory = null; QueueConnection queueConnection = null; QueueSession queueSession = null; Queue vendorOrderQueue = null; Queue retailerConfirmationQueue = null; QueueSender queueSender = null; MapMessage outMessage = null; QueueReceiver orderConfirmationReceiver = null; MapMessage inMessage = null; try { queueConnectionFactory = SampleUtilities.getQueueConnectionFactory(); queueConnection = queueConnectionFactory.createQueueConnection(); queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); vendorOrderQueue = SampleUtilities.getQueue(vendorOrderQueueName, queueSession); retailerConfirmationQueue = SampleUtilities.getQueue(retailerConfirmationQueueName, queueSession); } catch (Exception e) { System.out.println("Connection problem: " + e.toString()); System.out.println("Program assumes five queues named A B C D E"); if (queueConnection != null) { try { queueConnection.close(); } catch (JMSException ee) {} } System.exit(1); } /* * Create non-transacted session and sender for vendor order * queue. * Create message to vendor, setting item and quantity values. * Send message. * Create receiver for retailer confirmation queue. * Get message and report result. * Send an end-of-message-stream message so vendor will * stop processing orders. */ try { queueSender = queueSession.createSender(vendorOrderQueue); outMessage = queueSession.createMapMessage(); outMessage.setString("Item", "Computer(s)"); outMessage.setInt("Quantity", quantity); outMessage.setJMSReplyTo(retailerConfirmationQueue); queueSender.send(outMessage); System.out.println("Retailer: ordered " + quantity + " computer(s)"); orderConfirmationReceiver = queueSession.createReceiver(retailerConfirmationQueue); queueConnection.start(); inMessage = (MapMessage) orderConfirmationReceiver.receive(); if (inMessage.getBoolean("OrderAccepted") == true) { System.out.println("Retailer: Order filled"); } else { System.out.println("Retailer: Order not filled"); } System.out.println("Retailer: placing another order"); outMessage.setInt("Quantity", quantity * 2); queueSender.send(outMessage); System.out.println("Retailer: ordered " + outMessage.getInt("Quantity") + " computer(s)"); inMessage = (MapMessage) orderConfirmationReceiver.receive(); if (inMessage.getBoolean("OrderAccepted") == true) { System.out.println("Retailer: Order filled"); } else { System.out.println("Retailer: Order not filled"); } // Send a non-text control message indicating end of messages. queueSender.send(queueSession.createMessage()); } catch (Exception e) { System.out.println("Retailer: Exception occurred: " + e.toString()); e.printStackTrace(); exitResult = 1; } finally { if (queueConnection != null) { try { queueConnection.close(); } catch (JMSException e) { exitResult = 1; } } } } } /** * The Vendor class uses one transaction to receive the computer order from * the retailer and order the needed number of monitors and disk drives * from its suppliers. At random intervals, it throws an exception to * simulate a database problem and cause a rollback. * <p> * The class uses an asynchronous message listener to process replies from * suppliers. When all outstanding supplier inquiries complete, it sends a * message to the Retailer accepting or refusing the order. * * @author Kim Haase * @author Joseph Fialli * @version 1.3, 08/18/00 */ public static class Vendor extends Thread { Random rgen = new Random(); int throwException = 1; /** * Runs the thread. */ public void run() { QueueConnectionFactory queueConnectionFactory = null; QueueConnection queueConnection = null; QueueSession queueSession = null; QueueSession asyncQueueSession = null; Queue vendorOrderQueue = null; Queue monitorOrderQueue = null; Queue storageOrderQueue = null; Queue vendorConfirmationQueue = null; QueueReceiver vendorOrderQueueReceiver = null; QueueSender monitorOrderQueueSender = null; QueueSender storageOrderQueueSender = null; MapMessage orderMessage = null; QueueReceiver vendorConfirmationQueueReceiver = null; VendorMessageListener listener = null; Message inMessage = null; MapMessage vendorOrderMessage = null; Message endOfMessageStream = null; Order order = null; int quantity = 0; try { queueConnectionFactory = SampleUtilities.getQueueConnectionFactory(); queueConnection = queueConnectionFactory.createQueueConnection(); queueSession = queueConnection.createQueueSession(true, 0); asyncQueueSession = queueConnection.createQueueSession(true, 0); vendorOrderQueue = SampleUtilities.getQueue(vendorOrderQueueName, queueSession); monitorOrderQueue = SampleUtilities.getQueue(monitorOrderQueueName, queueSession); storageOrderQueue = SampleUtilities.getQueue(storageOrderQueueName, queueSession); vendorConfirmationQueue = SampleUtilities.getQueue(vendorConfirmationQueueName, queueSession); } catch (Exception e) { System.out.println("Connection problem: " + e.toString()); System.out.println("Program assumes six queues named A B C D E F"); if (queueConnection != null) { try { queueConnection.close();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -