/** * Receives a message from the given blocking queue, waiting up to the given timeout value. * * @param queue the queue from which to consume * @param timeout greater than 0 to wait the given number of milliseconds, 0 for unlimited * blocking wait, less than zero for no wait * @return the message received or null if no message was received * @throws JMSException */ protected Message receive(BlockingQueue<byte[]> queue, long timeout) throws JMSException { // Figure out the receive strategy. ReceiveStrategy receiver = null; if (timeout < 0) { receiver = new IndefiniteBlockingReceive(); } else { receiver = new TimedBlockingReceive(timeout); } Message msg = null; do { synchronized (STOP_GUARD) { try { byte[] msgData = receiver.receive(queue); // Check that we got message data if (msgData != null) { // Convert the message data back into a JMS message msg = messageMarshaller.toMessage(msgData); // Switch Bytes messages to read mode if (msg instanceof BytesMessage) { ((BytesMessage) msg).reset(); } // Check for message expiration long expirationTime = msg.getJMSExpiration(); if (expirationTime != 0 && expirationTime <= System.currentTimeMillis()) { log.info( format("Dropping message [%s] because it has expired.", msg.getJMSMessageID())); msg = null; } } } catch (InterruptedException ex) { throw new JMSException("Error receiving message: " + ex.getMessage()); } catch (IOException ex) { throw new JMSException("Error receiving message: " + ex.getMessage()); } } } while (msg == null && receiver.isRetryable()); return msg; }
public void onMessage(Message message) { if (message instanceof TextMessage) { TextMessage msg = (TextMessage) message; try { String unitOfOrder = message.getStringProperty("JMS_BEA_UnitOfOrder"); // Sleep for 2 seconds to demonstrate the messages are indeed // processes sequentially (in unit-of-order) Thread.sleep(2000); System.out.println( "UOOListener:: MDB=[" + mdbId + "] UOO=[" + unitOfOrder + "] Message=[" + msg.getText() + "]"); } catch (JMSException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }