/**
  * Routes content through exchanges, delivering it to 1 or more queues.
  *
  * @param payload
  * @throws AMQException if something goes wrong delivering data
  */
 public void routeContent(IncomingMessage payload) throws AMQException {
   final AMQShortString exchange = payload.getExchange();
   final Exchange exch = getExchange(exchange);
   // there is a small window of opportunity for the exchange to be deleted in between
   // the BasicPublish being received (where the exchange is validated) and the final
   // content body being received (which triggers this method)
   // TODO: check where the exchange is validated
   if (exch == null) {
     throw new AMQException("Exchange '" + exchange + "' does not exist");
   }
   payload.enqueue(exch.route(payload));
 }
示例#2
0
  private void sendMessages(int messageCount, boolean persistent) throws AMQException {
    for (int i = 0; i < messageCount; i++) {
      IncomingMessage currentMessage = message(false, persistent);
      ArrayList<AMQQueue> qs = new ArrayList<AMQQueue>();
      qs.add(getQueue());
      currentMessage.enqueue(qs);

      // route header
      MessageMetaData mmd = currentMessage.headersReceived();
      currentMessage.setStoredMessage(getMessageStore().addMessage(mmd));

      // Add the body so we have somthing to test later
      currentMessage.addContentBodyFrame(
          getSession()
              .getMethodRegistry()
              .getProtocolVersionMethodConverter()
              .convertToContentChunk(
                  new ContentBody(ByteBuffer.allocate((int) MESSAGE_SIZE), MESSAGE_SIZE)));

      AMQMessage m = new AMQMessage(currentMessage.getStoredMessage());
      for (BaseQueue q : currentMessage.getDestinationQueues()) {
        q.enqueue(m);
      }
    }
  }
示例#3
0
  private IncomingMessage message(final boolean immediate, boolean persistent) throws AMQException {
    MessagePublishInfo publish =
        new MessagePublishInfo() {

          public AMQShortString getExchange() {
            return null;
          }

          public void setExchange(AMQShortString exchange) {
            throw new NotImplementedException();
          }

          public void setRoutingKey(AMQShortString routingKey) {
            throw new NotImplementedException();
          }

          public boolean isImmediate() {
            return immediate;
          }

          public boolean isMandatory() {
            return false;
          }

          public AMQShortString getRoutingKey() {
            return null;
          }
        };

    ContentHeaderBody contentHeaderBody = new ContentHeaderBody();
    contentHeaderBody.bodySize = MESSAGE_SIZE; // in bytes
    contentHeaderBody.setProperties(new BasicContentHeaderProperties());
    ((BasicContentHeaderProperties) contentHeaderBody.getProperties())
        .setDeliveryMode((byte) (persistent ? 2 : 1));
    IncomingMessage msg = new IncomingMessage(publish);
    msg.setContentHeaderBody(contentHeaderBody);
    return msg;
  }
示例#4
0
  public void testExceptions() throws Exception {
    try {
      _queueMBean.viewMessages(0L, 3L);
      fail();
    } catch (JMException ex) {

    }

    try {
      _queueMBean.viewMessages(2L, 1L);
      fail();
    } catch (JMException ex) {

    }

    try {
      _queueMBean.viewMessages(-1L, 1L);
      fail();
    } catch (JMException ex) {

    }

    try {
      long end = Integer.MAX_VALUE;
      end += 2;
      _queueMBean.viewMessages(1L, end);
      fail("Expected Exception due to oversized(> 2^31) message range");
    } catch (JMException ex) {

    }

    IncomingMessage msg = message(false, false);
    getQueue().clearQueue();
    ArrayList<AMQQueue> qs = new ArrayList<AMQQueue>();
    qs.add(getQueue());
    msg.enqueue(qs);
    MessageMetaData mmd = msg.headersReceived();
    msg.setStoredMessage(getMessageStore().addMessage(mmd));
    long id = msg.getMessageNumber();

    msg.addContentBodyFrame(
        new ContentChunk() {
          ByteBuffer _data = ByteBuffer.allocate((int) MESSAGE_SIZE);

          {
            _data.limit((int) MESSAGE_SIZE);
          }

          public int getSize() {
            return (int) MESSAGE_SIZE;
          }

          public ByteBuffer getData() {
            return _data;
          }

          public void reduceToFit() {}
        });

    AMQMessage m = new AMQMessage(msg.getStoredMessage());
    for (BaseQueue q : msg.getDestinationQueues()) {
      q.enqueue(m);
    }
    //        _queue.process(_storeContext, new QueueEntry(_queue, msg), false);
    _queueMBean.viewMessageContent(id);
    try {
      _queueMBean.viewMessageContent(id + 1);
      fail();
    } catch (JMException ex) {

    }
  }