private Object[] listSubscribersInfos(final DurabilityType durability) { List<QueueControl> queues = getQueues(durability); List<Object[]> subInfos = new ArrayList<>(queues.size()); for (QueueControl queue : queues) { String clientID = null; String subName = null; if (queue.isDurable()) { Pair<String, String> pair = ActiveMQDestination.decomposeQueueNameForDurableSubscription(queue.getName()); clientID = pair.getA(); subName = pair.getB(); } String filter = queue.getFilter() != null ? queue.getFilter() : null; Object[] subscriptionInfo = new Object[6]; subscriptionInfo[0] = queue.getName(); subscriptionInfo[1] = clientID; subscriptionInfo[2] = subName; subscriptionInfo[3] = queue.isDurable(); subscriptionInfo[4] = queue.getMessageCount(); subscriptionInfo[5] = filter; subInfos.add(subscriptionInfo); } return subInfos.toArray(new Object[subInfos.size()]); }
@Override public void dropAllSubscriptions() throws Exception { ActiveMQServerControl serverControl = (ActiveMQServerControl) managementService.getResource(ResourceNames.CORE_SERVER); String[] queues = addressControl.getQueueNames(); for (String queue : queues) { // Drop all subscription shouldn't delete the dummy queue used to identify if the topic exists // on the core queues. // we will just ignore this queue if (!queue.equals(managedTopic.getAddress())) { serverControl.destroyQueue(queue); } } }
public static void main(String[] args) throws Exception { ConnectionFactory factory = new ActiveMQJMSConnectionFactory("tcp://localhost:61616"); Destination destination = ActiveMQDestination.fromPrefixedName("queue://orders"); try (Connection conn = factory.createConnection()) { Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(destination); ObjectMessage message = session.createObjectMessage(); Order order = new Order("Bill", "$199.99", "iPhone4"); message.setObject(order); producer.send(message); } }
@Override public void dropDurableSubscription(final String clientID, final String subscriptionName) throws Exception { String queueName = ActiveMQDestination.createQueueNameForDurableSubscription(true, clientID, subscriptionName); QueueControl coreQueueControl = (QueueControl) managementService.getResource(ResourceNames.CORE_QUEUE + queueName); if (coreQueueControl == null) { throw new IllegalArgumentException( "No subscriptions with name " + queueName + " for clientID " + clientID); } ActiveMQServerControl serverControl = (ActiveMQServerControl) managementService.getResource(ResourceNames.CORE_SERVER); serverControl.destroyQueue(queueName); }
@Override public int countMessagesForSubscription( final String clientID, final String subscriptionName, final String filterStr) throws Exception { String queueName = ActiveMQDestination.createQueueNameForDurableSubscription(true, clientID, subscriptionName); QueueControl coreQueueControl = (QueueControl) managementService.getResource(ResourceNames.CORE_QUEUE + queueName); if (coreQueueControl == null) { throw new IllegalArgumentException( "No subscriptions with name " + queueName + " for clientID " + clientID); } String filter = JMSTopicControlImpl.createFilterFromJMSSelector(filterStr); return coreQueueControl.listMessages(filter).length; }
private String listSubscribersInfosAsJSON(final DurabilityType durability) throws Exception { try { List<QueueControl> queues = getQueues(durability); JSONArray array = new JSONArray(); for (QueueControl queue : queues) { String clientID = null; String subName = null; if (queue.isDurable() && !queue.getName().startsWith(ResourceNames.JMS_TOPIC)) { Pair<String, String> pair = ActiveMQDestination.decomposeQueueNameForDurableSubscription(queue.getName()); clientID = pair.getA(); subName = pair.getB(); } else if (queue.getName().startsWith(ResourceNames.JMS_TOPIC)) { // in the case of heirarchical topics the queue name will not follow the <part>.<part> // pattern of normal // durable subscribers so skip decomposing the name for the client ID and subscription // name and just // hard-code it clientID = "ActiveMQ"; subName = "ActiveMQ"; } String filter = queue.getFilter() != null ? queue.getFilter() : null; JSONObject info = new JSONObject(); info.put("queueName", queue.getName()); info.put("clientID", clientID); info.put("selector", filter); info.put("name", subName); info.put("durable", queue.isDurable()); info.put("messageCount", queue.getMessageCount()); info.put("deliveringCount", queue.getDeliveringCount()); info.put("consumers", new JSONArray(queue.listConsumersAsJSON())); array.put(info); } return array.toString(); } catch (Exception e) { e.printStackTrace(); return e.toString(); } }
@Override public String getAddress() { return managedTopic.getAddress(); }
@Override public boolean isTemporary() { return managedTopic.isTemporary(); }
@Override public String getName() { return managedTopic.getName(); }
@Override public String[] getRegistryBindings() { return jmsServerManager.getBindingsOnTopic(managedTopic.getName()); }
@Override public void addBinding(String binding) throws Exception { jmsServerManager.addTopicToBindingRegistry(managedTopic.getName(), binding); }
public void init() throws Exception { AMQServerSession coreSession = session.getCoreSession(); SimpleString selector = info.getSelector() == null ? null : new SimpleString(info.getSelector()); nativeId = session.getCoreServer().getStorageManager().generateID(); SimpleString address = new SimpleString(this.actualDest.getPhysicalName()); if (this.actualDest.isTopic()) { String physicalName = this.actualDest.getPhysicalName(); if (physicalName.contains(".>")) { // wildcard physicalName = OpenWireUtil.convertWildcard(physicalName); } // on recreate we don't need to create queues address = new SimpleString("jms.topic." + physicalName); if (info.isDurable()) { subQueueName = new SimpleString( ActiveMQDestination.createQueueNameForDurableSubscription( true, info.getClientId(), info.getSubscriptionName())); QueueQueryResult result = coreSession.executeQueueQuery(subQueueName); if (result.isExists()) { // Already exists if (result.getConsumerCount() > 0) { throw new IllegalStateException( "Cannot create a subscriber on the durable subscription since it already has subscriber(s)"); } SimpleString oldFilterString = result.getFilterString(); boolean selectorChanged = selector == null && oldFilterString != null || oldFilterString == null && selector != null || oldFilterString != null && selector != null && !oldFilterString.equals(selector); SimpleString oldTopicName = result.getAddress(); boolean topicChanged = !oldTopicName.equals(address); if (selectorChanged || topicChanged) { // Delete the old durable sub coreSession.deleteQueue(subQueueName); // Create the new one coreSession.createQueue(address, subQueueName, selector, false, true); } } else { coreSession.createQueue(address, subQueueName, selector, false, true); } } else { subQueueName = new SimpleString(UUID.randomUUID().toString()); coreSession.createQueue(address, subQueueName, selector, true, false); } coreSession.createConsumer(nativeId, subQueueName, null, info.isBrowser(), false, -1); } else { SimpleString queueName = new SimpleString("jms.queue." + this.actualDest.getPhysicalName()); coreSession.createConsumer(nativeId, queueName, selector, info.isBrowser(), false, -1); } if (info.isBrowser()) { AMQServerConsumer coreConsumer = coreSession.getConsumer(nativeId); coreConsumer.setBrowserListener(this); } }