private QueueConsumer recreateTopicConsumer(String subscriptionId, boolean autoAck) {
   QueueConsumer consumer;
   if (subscriptionExists(subscriptionId)) {
     QueueConsumer tmp = null;
     try {
       tmp =
           createConsumer(
               true, autoAck, subscriptionId, null, consumerTimeoutSeconds * 1000, false);
     } catch (ActiveMQException e) {
       throw new RuntimeException(e);
     }
     consumer = queueConsumers.putIfAbsent(subscriptionId, tmp);
     if (consumer == null) {
       consumer = tmp;
       serviceManager.getTimeoutTask().add(this, subscriptionId);
     } else {
       tmp.shutdown();
     }
   } else {
     throw new WebApplicationException(
         Response.status(405)
             .entity("Failed to find subscriber " + subscriptionId + " you will have to reconnect")
             .type("text/plain")
             .build());
   }
   return consumer;
 }
 private void shutdown(QueueConsumer consumer) {
   synchronized (consumer) {
     consumer.shutdown();
     queueConsumers.remove(consumer.getId());
     Subscription subscription = (Subscription) consumer;
     if (subscription.isDeleteWhenIdle()) deleteSubscriberQueue(consumer);
   }
 }
 private void internalDeleteSubscription(String consumerId) {
   QueueConsumer consumer = queueConsumers.remove(consumerId);
   if (consumer == null) {
     String msg = "Failed to match a subscription to URL " + consumerId;
     throw new WebApplicationException(
         Response.status(Response.Status.NOT_FOUND).entity(msg).type("text/plain").build());
   }
   consumer.shutdown();
   deleteSubscriberQueue(consumer);
 }
 public void stop() {
   for (QueueConsumer consumer : queueConsumers.values()) {
     consumer.shutdown();
     Subscription subscription = (Subscription) consumer;
     if (!subscription.isDurable()) {
       deleteSubscriberQueue(consumer);
     }
   }
   queueConsumers.clear();
 }
 @Override
 public boolean testTimeout(String target, boolean autoShutdown) {
   QueueConsumer consumer = queueConsumers.get(target);
   Subscription subscription = (Subscription) consumer;
   if (consumer == null) return false;
   if (System.currentTimeMillis() - consumer.getLastPingTime() > subscription.getTimeout()) {
     ActiveMQRestLogger.LOGGER.shutdownRestSubscription(consumer.getId());
     if (autoShutdown) {
       shutdown(consumer);
     }
     return true;
   } else {
     return false;
   }
 }
 private void headAutoAckSubscriptionResponse(
     UriInfo uriInfo,
     QueueConsumer consumer,
     Response.ResponseBuilder builder,
     String pathToPullSubscriptions) {
   // we synchronize just in case a failed request is still processing
   synchronized (consumer) {
     QueueConsumer.setConsumeNextLink(
         serviceManager.getLinkStrategy(),
         builder,
         uriInfo,
         pathToPullSubscriptions + "/acknowledged/" + consumer.getId(),
         Long.toString(consumer.getConsumeIndex()));
   }
 }
  private void deleteSubscriberQueue(QueueConsumer consumer) {
    String subscriptionName = consumer.getId();
    ClientSession session = null;
    try {
      session = sessionFactory.createSession();

      session.deleteQueue(subscriptionName);
    } catch (ActiveMQException e) {
    } finally {
      if (session != null) {
        try {
          session.close();
        } catch (ActiveMQException e) {
        }
      }
    }
  }
  @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) {
    ActiveMQRestLogger.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();
        String pathToPullSubscriptions = uriInfo.getMatchedURIs().get(0);
        if (autoAck) {
          headAutoAckSubscriptionResponse(uriInfo, consumer, builder, pathToPullSubscriptions);
          consumer.setSessionLink(
              builder, uriInfo, pathToPullSubscriptions + "/auto-ack/" + consumer.getId());
        } else {
          headAcknowledgedConsumerResponse(uriInfo, (AcknowledgedQueueConsumer) consumer, builder);
          consumer.setSessionLink(
              builder, uriInfo, pathToPullSubscriptions + "/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(0) + "/auto-ack/" + consumer.getId(),
            "-1");
      } else {
        AcknowledgedQueueConsumer.setAcknowledgeNextLink(
            serviceManager.getLinkStrategy(),
            builder,
            uriInfo,
            uriInfo.getMatchedURIs().get(0) + "/acknowledged/" + consumer.getId(),
            "-1");
      }
      return builder.build();

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