1 29 30 package com.caucho.quercus.lib.jms; 31 32 import com.caucho.quercus.annotation.NotNull; 33 import com.caucho.quercus.annotation.Optional; 34 import com.caucho.quercus.env.*; 35 import com.caucho.quercus.program.JavaClassDef; 36 import com.caucho.util.*; 37 38 import javax.jms.*; 39 import javax.naming.Context ; 40 import java.io.Serializable ; 41 import java.util.Enumeration ; 42 import java.util.Map ; 43 import java.util.Set ; 44 import java.util.logging.Logger ; 45 46 49 public class JMSQueue 50 { 51 private static final L10N L = new L10N(JMSQueue.class); 52 private static final Logger log = Logger.getLogger(JMSQueue.class.getName()); 53 54 private Connection _connection; 55 private Session _session; 56 private MessageConsumer _consumer; 57 private MessageProducer _producer; 58 private Destination _destination; 59 60 63 public JMSQueue(ConnectionFactory connectionFactory, 64 Destination queue) 65 throws Exception 66 { 67 _connection = connectionFactory.createConnection(); 68 69 _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 70 71 if (queue == null) 72 _destination = _session.createTemporaryQueue(); 73 else 74 _destination = queue; 75 76 _consumer = _session.createConsumer(_destination); 77 _producer = _session.createProducer(_destination); 78 79 _connection.start(); 80 } 81 82 public static Value __construct(Env env, @Optional String queueName) 83 { 84 JMSQueue queue = JMSModule.message_get_queue(env, queueName, null); 85 86 if (queue == null) { 87 env.warning(L.l("'{0}' is an unknown JMSQueue", queueName)); 88 return NullValue.NULL; 89 } 90 91 return new JavaValue(env, queue, 92 env.getJavaClassDefinition(JMSQueue.class.getName())); 93 } 94 95 public boolean send(@NotNull Value value, @Optional JMSQueue replyTo) 96 throws JMSException 97 { 98 Message message = null; 99 100 if (value.isArray()) { 101 message = _session.createMapMessage(); 102 103 ArrayValue array = (ArrayValue) value; 104 105 Set <Map.Entry <Value,Value>> entrySet = array.entrySet(); 106 107 for (Map.Entry <Value,Value> entry : entrySet) { 108 if (entry.getValue() instanceof BinaryValue) { 109 byte []bytes = ((BinaryValue) entry.getValue()).toBytes(); 110 111 ((MapMessage) message).setBytes(entry.getKey().toString(), bytes); 112 } else { 113 ((MapMessage) message).setString(entry.getKey().toString(), 115 entry.getValue().toString()); 116 } 117 } 118 } else if (value instanceof BinaryValue) { 119 message = _session.createBytesMessage(); 120 121 122 byte []bytes = ((BinaryValue) value).toBytes(); 123 124 ((BytesMessage) message).writeBytes(bytes); 125 } else if (value.isLongConvertible()) { 126 message = _session.createStreamMessage(); 127 128 ((StreamMessage) message).writeLong(value.toLong()); 129 } else if (value.isDoubleConvertible()) { 130 message = _session.createStreamMessage(); 131 132 ((StreamMessage) message).writeDouble(value.toDouble()); 133 } else if (value.toJavaObject() instanceof String ) { 134 message = _session.createTextMessage(); 135 136 ((TextMessage) message).setText(value.toString()); 137 } else if (value.toJavaObject() instanceof Serializable ) { 138 message = _session.createObjectMessage(); 139 140 ((ObjectMessage) message).setObject((Serializable ) value.toJavaObject()); 141 } else { 142 return false; 143 } 144 145 if (replyTo != null) 146 message.setJMSReplyTo(replyTo._destination); 147 148 _producer.send(message); 149 150 return true; 151 } 152 153 public Value receive(Env env, @Optional("1") long timeout) 154 throws JMSException 155 { 156 Message message = _consumer.receive(timeout); 157 158 if (message == null) 159 return BooleanValue.FALSE; 160 161 if (message instanceof ObjectMessage) { 162 Object object = ((ObjectMessage) message).getObject(); 163 164 return objectToValue(object, env); 165 } else if (message instanceof TextMessage) { 166 return new StringValueImpl(((TextMessage) message).getText()); 167 } else if (message instanceof StreamMessage) { 168 Object object = ((StreamMessage) message).readObject(); 169 170 return objectToValue(object, env); 171 } else if (message instanceof BytesMessage) { 172 BytesMessage bytesMessage = (BytesMessage) message; 173 174 BinaryBuilderValue bb = 175 new BinaryBuilderValue((int) bytesMessage.getBodyLength()); 176 177 bytesMessage.readBytes(bb.getBuffer()); 178 bb.setOffset((int) bytesMessage.getBodyLength()); 179 180 return bb; 181 } else if (message instanceof MapMessage) { 182 MapMessage mapMessage = (MapMessage) message; 183 184 Enumeration mapNames = mapMessage.getMapNames(); 185 186 ArrayValue array = new ArrayValueImpl(); 187 188 while (mapNames.hasMoreElements()) { 189 String name = mapNames.nextElement().toString(); 190 191 Object object = mapMessage.getObject(name); 192 193 array.put(new StringValueImpl(name), objectToValue(object, env)); 194 } 195 196 return array; 197 } else { 198 return BooleanValue.FALSE; 199 } 200 } 201 202 protected void finalize() 203 { 204 try { 205 _connection.close(); 206 } catch (JMSException e) {} 207 } 208 209 private static Value objectToValue(Object object, Env env) 210 { 211 JavaClassDef def = 212 env.getQuercus().getJavaClassDefinition(object.getClass().getName()); 213 214 if (object instanceof Long ) { 215 return LongValue.create(((Long ) object).longValue()); 216 } else if (object instanceof Integer ) { 217 return LongValue.create(((Integer ) object).intValue()); 218 } else if (object instanceof Double ) { 219 return DoubleValue.create(((Double ) object).doubleValue()); 220 } else { 221 return new JavaValue(env, object, def); 222 } 223 } 224 } 225 226 | Popular Tags |