@Path("auto-ack/{subscription-id}")
  @DELETE
  public void deleteSubscription(
      @Context UriInfo uriInfo, @PathParam("subscription-id") String consumerId) {
    HornetQRestLogger.LOGGER.debug("Handling DELETE request for \"" + uriInfo.getPath() + "\"");

    internalDeleteSubscription(consumerId);
  }
  @Path("auto-ack/{consumer-id}")
  @GET
  public Response getAutoAckSubscription(
      @PathParam("consumer-id") String consumerId, @Context UriInfo uriInfo) throws Exception {
    HornetQRestLogger.LOGGER.debug("Handling GET request for \"" + uriInfo.getPath() + "\"");

    return internalHeadAutoAckSubscription(uriInfo, consumerId);
  }
  @Path("acknowledged/{consumer-id}")
  @HEAD
  public Response headAcknowledgedConsumer(
      @PathParam("consumer-id") String consumerId, @Context UriInfo uriInfo) throws Exception {
    HornetQRestLogger.LOGGER.debug("Handling HEAD request for \"" + uriInfo.getPath() + "\"");

    return internalHeadAcknowledgedConsumer(uriInfo, consumerId);
  }
 public void testTimeout(String target) {
   QueueConsumer consumer = queueConsumers.get(target);
   Subscription subscription = (Subscription) consumer;
   if (consumer == null) return;
   synchronized (consumer) {
     if (System.currentTimeMillis() - consumer.getLastPingTime() > subscription.getTimeout()) {
       HornetQRestLogger.LOGGER.shutdownRestSubscription(consumer.getId());
       consumer.shutdown();
       queueConsumers.remove(consumer.getId());
       serviceManager.getTimeoutTask().remove(consumer.getId());
       if (subscription.isDeleteWhenIdle()) deleteSubscriberQueue(consumer);
     }
   }
 }
  @POST
  public Response createSubscription(
      @FormParam("durable") @DefaultValue("false") boolean durable,
      @FormParam("autoAck") @DefaultValue("true") boolean autoAck,
      @FormParam("name") String subscriptionName,
      @FormParam("selector") String selector,
      @FormParam("delete-when-idle") Boolean destroyWhenIdle,
      @FormParam("idle-timeout") Long timeout,
      @Context UriInfo uriInfo) {
    HornetQRestLogger.LOGGER.debug("Handling POST request for \"" + uriInfo.getPath() + "\"");

    if (timeout == null) timeout = Long.valueOf(consumerTimeoutSeconds * 1000);
    boolean deleteWhenIdle = !durable; // default is true if non-durable
    if (destroyWhenIdle != null) deleteWhenIdle = destroyWhenIdle.booleanValue();

    if (subscriptionName != null) {
      // see if this is a reconnect
      QueueConsumer consumer = queueConsumers.get(subscriptionName);
      if (consumer != null) {
        boolean acked = consumer instanceof AcknowledgedSubscriptionResource;
        acked = !acked;
        if (acked != autoAck) {
          throw new WebApplicationException(
              Response.status(412)
                  .entity("Consumer already exists and ack-modes don't match.")
                  .type("text/plain")
                  .build());
        }
        Subscription sub = (Subscription) consumer;
        if (sub.isDurable() != durable) {
          throw new WebApplicationException(
              Response.status(412)
                  .entity("Consumer already exists and durability doesn't match.")
                  .type("text/plain")
                  .build());
        }
        Response.ResponseBuilder builder = Response.noContent();
        if (autoAck) {
          headAutoAckSubscriptionResponse(uriInfo, consumer, builder);
          consumer.setSessionLink(
              builder, uriInfo, uriInfo.getMatchedURIs().get(1) + "/auto-ack/" + consumer.getId());
        } else {
          headAcknowledgedConsumerResponse(uriInfo, (AcknowledgedQueueConsumer) consumer, builder);
          consumer.setSessionLink(
              builder,
              uriInfo,
              uriInfo.getMatchedURIs().get(1) + "/acknowledged/" + consumer.getId());
        }
        return builder.build();
      }
    } else {
      subscriptionName = generateSubscriptionName();
    }
    ClientSession session = null;
    try {
      // if this is not a reconnect, create the subscription queue
      if (!subscriptionExists(subscriptionName)) {
        session = sessionFactory.createSession();

        if (durable) {
          session.createQueue(destination, subscriptionName, true);
        } else {
          session.createTemporaryQueue(destination, subscriptionName);
        }
      }
      QueueConsumer consumer =
          createConsumer(durable, autoAck, subscriptionName, selector, timeout, deleteWhenIdle);
      queueConsumers.put(consumer.getId(), consumer);
      serviceManager.getTimeoutTask().add(this, consumer.getId());

      UriBuilder location = uriInfo.getAbsolutePathBuilder();
      if (autoAck) location.path("auto-ack");
      else location.path("acknowledged");
      location.path(consumer.getId());
      Response.ResponseBuilder builder = Response.created(location.build());
      if (autoAck) {
        QueueConsumer.setConsumeNextLink(
            serviceManager.getLinkStrategy(),
            builder,
            uriInfo,
            uriInfo.getMatchedURIs().get(1) + "/auto-ack/" + consumer.getId(),
            "-1");
      } else {
        AcknowledgedQueueConsumer.setAcknowledgeNextLink(
            serviceManager.getLinkStrategy(),
            builder,
            uriInfo,
            uriInfo.getMatchedURIs().get(1) + "/acknowledged/" + consumer.getId(),
            "-1");
      }
      return builder.build();

    } catch (HornetQException e) {
      throw new RuntimeException(e);
    } finally {
      if (session != null) {
        try {
          session.close();
        } catch (HornetQException e) {
        }
      }
    }
  }