001: /*
002: * ====================================================================
003: *
004: * XFLOW - Process Management System
005: * Copyright (C) 2003 Rob Tan
006: * All rights reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * 1. Redistributions of source code must retain the above copyright
013: * notice, this list of conditions, and the following disclaimer.
014: *
015: * 2. Redistributions in binary form must reproduce the above copyright
016: * notice, this list of conditions, and the disclaimer that follows
017: * these conditions in the documentation and/or other materials
018: * provided with the distribution.
019: *
020: * 3. The name "XFlow" must not be used to endorse or promote products
021: * derived from this software without prior written permission. For
022: * written permission, please contact rcktan@yahoo.com
023: *
024: * 4. Products derived from this software may not be called "XFlow", nor
025: * may "XFlow" appear in their name, without prior written permission
026: * from the XFlow Project Management (rcktan@yahoo.com)
027: *
028: * In addition, we request (but do not require) that you include in the
029: * end-user documentation provided with the redistribution and/or in the
030: * software itself an acknowledgement equivalent to the following:
031: * "This product includes software developed by the
032: * XFlow Project (http://xflow.sourceforge.net/)."
033: * Alternatively, the acknowledgment may be graphical using the logos
034: * available at http://xflow.sourceforge.net/
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL THE XFLOW AUTHORS OR THE PROJECT
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: * ====================================================================
050: * This software consists of voluntary contributions made by many
051: * individuals on behalf of the XFlow Project and was originally
052: * created by Rob Tan (rcktan@yahoo.com)
053: * For more information on the XFlow Project, please see:
054: * <http://xflow.sourceforge.net/>.
055: * ====================================================================
056: */
057: package xflow.messaging;
058:
059: import java.util.*;
060: import java.io.*;
061: import javax.jms.*;
062: import javax.naming.*;
063: import java.lang.*;
064:
065: import xflow.common.*;
066: import xflow.protocol.*;
067:
068: public class SynchQueueMessaging {
069:
070: private static QueueConnection qconn = null;
071: private static QueueSession qsession = null;
072: private static Queue receiveQueue = null;
073: private static Queue wfQueue = null;
074:
075: static {
076:
077: try {
078:
079: // Tomcat doesn't seem to find jndi.properties -- so we might have to load manually
080: boolean jndiFileFound = true;
081: InitialContext iniCtx = null;
082: File f = new File("jndi.properties");
083: try {
084: FileReader fr = new FileReader(f);
085: } catch (FileNotFoundException e) {
086: jndiFileFound = false;
087: }
088: if (jndiFileFound) {
089: System.out.println("Loading from jndi.properties file");
090: Properties props = new Properties();
091: props.load(new FileInputStream("jndi.properties"));
092: String namingFactory = (String) props
093: .get("java.naming.factory.initial");
094: String providerUrl = (String) props
095: .get("java.naming.provider.url");
096: String factoryUrlPkg = (String) props
097: .get("java.naming.factory.url.pkgs");
098: Hashtable env = new Hashtable();
099: env.put("java.naming.factory.initial", namingFactory);
100: env.put("java.naming.provider.url", providerUrl);
101: env.put("java.naming.factory.url.pkgs", factoryUrlPkg);
102: iniCtx = new InitialContext(env);
103: } else {
104: iniCtx = new InitialContext();
105: }
106:
107: Object tmp = iniCtx
108: .lookup(XflowConstants.XFLOW_CONNECTION_FACTORY);
109: QueueConnectionFactory qcf = (QueueConnectionFactory) tmp;
110: qconn = qcf.createQueueConnection();
111:
112: qsession = qconn.createQueueSession(false,
113: QueueSession.AUTO_ACKNOWLEDGE);
114: receiveQueue = (Queue) iniCtx
115: .lookup(XflowConstants.XFLOW_QUEUE);
116: //receiveQueue = qsession.createQueue("testQueue");
117:
118: qconn.start();
119:
120: wfQueue = (Queue) iniCtx
121: .lookup(XflowConstants.WORKFLOWENGINE_QUEUE);
122: JMSShutdownHook shook = new JMSShutdownHook();
123: Runtime.getRuntime().addShutdownHook(shook);
124: } catch (Exception e) {
125: e.printStackTrace();
126: }
127: }
128:
129: public static void close() throws JMSException {
130: qconn.close();
131: }
132:
133: public static Response sendRequest(Request req)
134: throws JMSException, IOException, ClassNotFoundException,
135: XflowException {
136:
137: // Send the request
138: ByteArrayOutputStream out = new ByteArrayOutputStream();
139: ObjectOutputStream s = new ObjectOutputStream(out);
140:
141: s.writeObject(req);
142: s.flush();
143: byte[] barr = out.toByteArray();
144: String replyName = req.replyName;
145: QueueReceiver receiver = qsession.createReceiver(receiveQueue,
146: "ReplyName in ('" + replyName + "')");
147: QueueSender sender = qsession.createSender(wfQueue);
148:
149: BytesMessage m = qsession.createBytesMessage();
150: m.writeBytes(barr);
151: m.setStringProperty("ReplyName", replyName);
152:
153: m.setJMSReplyTo(receiveQueue);
154: sender.send(m);
155:
156: // Now get the response
157: Message msg = receiver.receive(5000);
158: Response response = null;
159: if (msg != null) {
160: BytesMessage bytesMessage = (BytesMessage) msg;
161: barr = new byte[10000];
162: bytesMessage.readBytes(barr);
163: ByteArrayInputStream in = new ByteArrayInputStream(barr);
164: ObjectInputStream sin = new ObjectInputStream(in);
165: response = (Response) sin.readObject();
166: } else {
167: throw new XflowException(
168: "Response not received from server within 5 seconds.");
169: }
170: return response;
171: }
172:
173: }
|