@Override public void setRoutingType(RoutingType routingType) { if (addressInfo.getRoutingTypes().contains(routingType)) { this.routingType = routingType; } }
private AddressInfo mergedRoutingTypes(SimpleString address, AddressInfo... addressInfos) { EnumSet<RoutingType> mergedRoutingTypes = EnumSet.noneOf(RoutingType.class); for (AddressInfo addressInfo : addressInfos) { if (addressInfo != null) { mergedRoutingTypes.addAll(addressInfo.getRoutingTypes()); } } return new AddressInfo(address, mergedRoutingTypes); }
@Override public String[] getRoutingTypes() { EnumSet<RoutingType> routingTypes = addressInfo.getRoutingTypes(); String[] result = new String[routingTypes.size()]; int i = 0; for (RoutingType routingType : routingTypes) { result[i++] = routingType.toString(); } return result; }
@Override public String toString() { StringBuffer buff = new StringBuffer(); buff.append("Address [name=" + name); buff.append(", id=" + id); buff.append(", routingTypes={"); for (RoutingType routingType : getRoutingTypes()) { buff.append(routingType.toString() + ","); } // delete hanging comma if (buff.charAt(buff.length() - 1) == ',') { buff.deleteCharAt(buff.length() - 1); } buff.append("}"); buff.append(", autoCreated=" + autoCreated); buff.append("]"); return buff.toString(); }
@Override public StringBuilder format(AddressInfo addressInfo, StringBuilder output) { output.append("Address [name=").append(addressInfo.getName()); output.append(", routingTypes={"); final EnumSet<RoutingType> routingTypes = addressInfo.getRoutingTypes(); if (!routingTypes.isEmpty()) { for (RoutingType routingType : routingTypes) { output.append(routingType).append(','); } // delete hanging comma output.deleteCharAt(output.length() - 1); } output.append('}'); output.append(", autoCreated=").append(addressInfo.isAutoCreated()); output.append(']'); return output; } };
private RoutingType getRoutingType(Symbol[] symbols, SimpleString address) { if (symbols != null) { for (Symbol symbol : symbols) { if (AmqpSupport.TEMP_TOPIC_CAPABILITY.equals(symbol) || AmqpSupport.TOPIC_CAPABILITY.equals(symbol)) { return RoutingType.MULTICAST; } else if (AmqpSupport.TEMP_QUEUE_CAPABILITY.equals(symbol) || AmqpSupport.QUEUE_CAPABILITY.equals(symbol)) { return RoutingType.ANYCAST; } } } final AddressInfo addressInfo = sessionSPI.getAddress(address); if (addressInfo != null && !addressInfo.getRoutingTypes().isEmpty()) { if (addressInfo.getRoutingTypes().size() == 1 && addressInfo.getRoutingType() == RoutingType.MULTICAST) { return RoutingType.MULTICAST; } } RoutingType defaultRoutingType = sessionSPI.getDefaultRoutingType(address); defaultRoutingType = defaultRoutingType == null ? ActiveMQDefaultConfiguration.getDefaultRoutingType() : defaultRoutingType; return defaultRoutingType; }
private RoutingType getRoutingType(Symbol[] symbols, SimpleString address) { if (symbols != null) { for (Symbol symbol : symbols) { if (AmqpSupport.TEMP_TOPIC_CAPABILITY.equals(symbol) || AmqpSupport.TOPIC_CAPABILITY.equals(symbol)) { return RoutingType.MULTICAST; } else if (AmqpSupport.TEMP_QUEUE_CAPABILITY.equals(symbol) || AmqpSupport.QUEUE_CAPABILITY.equals(symbol)) { return RoutingType.ANYCAST; } } } final AddressInfo addressInfo = sessionSPI.getAddress(address); if (addressInfo != null && !addressInfo.getRoutingTypes().isEmpty()) { if (addressInfo.getRoutingTypes().size() == 1 && addressInfo.getRoutingType() == RoutingType.MULTICAST) { return RoutingType.MULTICAST; } } RoutingType defaultRoutingType = sessionSPI.getDefaultRoutingType(address); defaultRoutingType = defaultRoutingType == null ? ActiveMQDefaultConfiguration.getDefaultRoutingType() : defaultRoutingType; return defaultRoutingType; }
public void checkRoutingSemantics(String destination, RoutingType routingType) throws ActiveMQStompException { AddressInfo addressInfo = manager.getServer().getAddressInfo(SimpleString.toSimpleString(destination)); // may be null here if, for example, the management address is being checked if (addressInfo != null) { Set<RoutingType> actualDeliveryModesOfAddress = addressInfo.getRoutingTypes(); if (routingType != null && !actualDeliveryModesOfAddress.contains(routingType)) { throw BUNDLE.illegalSemantics(routingType.toString(), actualDeliveryModesOfAddress.toString()); } } }
public void checkRoutingSemantics(String destination, RoutingType routingType) throws ActiveMQStompException { AddressInfo addressInfo = manager.getServer().getAddressInfo(SimpleString.toSimpleString(destination)); // may be null here if, for example, the management address is being checked if (addressInfo != null) { Set<RoutingType> actualDeliveryModesOfAddress = addressInfo.getRoutingTypes(); if (routingType != null && !actualDeliveryModesOfAddress.contains(routingType)) { throw BUNDLE.illegalSemantics(routingType.toString(), actualDeliveryModesOfAddress.toString()); } } }
@Override public JsonObjectBuilder toJson(AddressInfo address) { if (address == null) { return null; } JsonObjectBuilder obj = JsonLoader.createObjectBuilder().add("id", toString(address.getId())).add("name", toString(address.getName())).add("routingTypes", toString(address.getRoutingTypes())); try { obj.add("queueCount", toString(server.bindingQuery(address.getName()).getQueueNames().size())); return obj; } catch (Exception e) { obj.add("queueCount", 0); } return obj; }
@Override public AddressInfo addOrUpdateAddressInfo(AddressInfo addressInfo) throws Exception { if (!addAddressInfo(addressInfo)) { updateAddressInfo(addressInfo.getName(), addressInfo.getRoutingTypes()); } return getAddressInfo(addressInfo.getName()); }
@Test public void testCreateAddress() throws Exception { String address = "address"; CreateAddress command = new CreateAddress(); command.setName(address); command.setAnycast(true); command.setMulticast(true); command.execute(new ActionContext(System.in, new PrintStream(output), new PrintStream(error))); checkExecutionPassed(command); AddressInfo addressInfo = server.getAddressInfo(new SimpleString(address)); assertNotNull(addressInfo); assertTrue(addressInfo.getRoutingTypes().contains(RoutingType.ANYCAST)); assertTrue(addressInfo.getRoutingTypes().contains(RoutingType.MULTICAST)); }
@Override public void addAddressBinding(final long tx, final AddressInfo addressInfo) throws Exception { PersistentAddressBindingEncoding bindingEncoding = new PersistentAddressBindingEncoding(addressInfo.getName(), addressInfo.getRoutingTypes(), addressInfo.isAutoCreated()); readLock(); try { long recordID = idGenerator.generateID(); bindingEncoding.setId(recordID); addressInfo.setId(recordID); bindingsJournal.appendAddRecordTransactional(tx, recordID, JournalRecordIds.ADDRESS_BINDING_RECORD, bindingEncoding); } finally { readUnLock(); } }
@Test public void testUpdateAddressRoutingTypes() throws Exception { final String addressName = "address"; final SimpleString address = new SimpleString(addressName); server.addAddressInfo(new AddressInfo(address, RoutingType.ANYCAST)); final UpdateAddress updateAddress = new UpdateAddress(); updateAddress.setName(addressName); updateAddress.setAnycast(true); updateAddress.setMulticast(true); updateAddress.execute(new ActionContext(System.in, new PrintStream(output), new PrintStream(error))); checkExecutionPassed(updateAddress); final AddressInfo addressInfo = server.getAddressInfo(address); assertNotNull(addressInfo); assertEquals(EnumSet.of(RoutingType.ANYCAST, RoutingType.MULTICAST), addressInfo.getRoutingTypes()); }
@Test(timeout = 60000) public void testConsumeWhenNoAddressHasBothRoutingTypesButDefaultQueueIsMultiCast() throws Exception { AddressInfo addressInfo = new AddressInfo(address); addressInfo.getRoutingTypes().add(RoutingType.ANYCAST); addressInfo.getRoutingTypes().add(RoutingType.MULTICAST); server.addAddressInfo(addressInfo); server.createQueue(address, RoutingType.MULTICAST, address, null, true, false); AmqpClient client = createAmqpClient(); AmqpConnection connection = addConnection(client.connect()); AmqpSession session = connection.createSession(); try { session.createReceiver(address.toString()); fail("expected exception"); } catch (Exception e) { //ignore } connection.close(); }
@Test(timeout = 60000) public void testConsumeWhenNoAddressHasBothRoutingTypesButDefaultQueueIsAnyCast() throws Exception { AddressInfo addressInfo = new AddressInfo(address); addressInfo.getRoutingTypes().add(RoutingType.MULTICAST); addressInfo.getRoutingTypes().add(RoutingType.ANYCAST); server.addAddressInfo(addressInfo); server.createQueue(address, RoutingType.MULTICAST, address, null, true, false); AmqpClient client = createAmqpClient(); AmqpConnection connection = addConnection(client.connect()); AmqpSession session = connection.createSession(); try { session.createReceiver(address.toString()); fail("expected exception"); } catch (Exception e) { //ignore } connection.close(); }
@Test public void persistAddressConfigTest() throws Exception { server.createQueue(SimpleString.toSimpleString("myAddress"), RoutingType.MULTICAST, SimpleString.toSimpleString("myQueue"), null, true, false); server.stop(); server.start(); AddressInfo addressInfo = server.getAddressInfo(SimpleString.toSimpleString("myAddress")); assertNotNull(addressInfo); Set<RoutingType> routingTypeSet = new HashSet<>(); routingTypeSet.add(RoutingType.MULTICAST); assertEquals(routingTypeSet, addressInfo.getRoutingTypes()); } }
@Test public void testAutoCreatedMulticastAddress() throws Exception { conn.connect(defUser, defPass); String queueName = UUID.randomUUID().toString(); SimpleString simpleQueueName = SimpleString.toSimpleString(queueName); Assert.assertNull(server.getAddressInfo(simpleQueueName)); Assert.assertNull(server.locateQueue(simpleQueueName)); send(conn, queueName, null, "Hello MULTICAST"); assertTrue("Address should be created now", Wait.waitFor(() -> (server.getAddressInfo(simpleQueueName) != null), 2000, 200)); assertTrue(server.getAddressInfo(simpleQueueName).getRoutingTypes().contains(RoutingType.MULTICAST)); Assert.assertNull(server.locateQueue(simpleQueueName)); } }
@Override public AddressQueryResult addressQuery(SimpleString name) throws Exception { if (name == null) { throw ActiveMQMessageBundle.BUNDLE.queueNameIsNull(); } SimpleString realName = CompositeAddress.extractAddressName(name); AddressSettings addressSettings = getAddressSettingsRepository().getMatch(realName.toString()); boolean autoCreateAddresses = addressSettings.isAutoCreateAddresses(); boolean defaultPurgeOnNoConsumers = addressSettings.isDefaultPurgeOnNoConsumers(); int defaultMaxConsumers = addressSettings.getDefaultMaxConsumers(); AddressInfo addressInfo = postOffice.getAddressInfo(realName); AddressQueryResult response; if (addressInfo != null) { response = new AddressQueryResult(addressInfo.getName(), addressInfo.getRoutingTypes(), addressInfo.getId(), addressInfo.isAutoCreated(), true, autoCreateAddresses, defaultPurgeOnNoConsumers, defaultMaxConsumers); } else { response = new AddressQueryResult(realName, null, -1, false, false, autoCreateAddresses, defaultPurgeOnNoConsumers, defaultMaxConsumers); } return response; }
@Test public void testAutoCreatedAnycastAddress() throws Exception { conn.connect(defUser, defPass); String queueName = UUID.randomUUID().toString(); SimpleString simpleQueueName = SimpleString.toSimpleString(queueName); Assert.assertNull(server.getAddressInfo(simpleQueueName)); Assert.assertNull(server.locateQueue(simpleQueueName)); server.getAddressSettingsRepository().addMatch(queueName, new AddressSettings() .setDefaultAddressRoutingType(RoutingType.ANYCAST) .setDefaultQueueRoutingType(RoutingType.ANYCAST) ); send(conn, queueName, null, "Hello ANYCAST"); assertTrue("Address and queue should be created now", Wait.waitFor(() -> (server.getAddressInfo(simpleQueueName) != null) && (server.locateQueue(simpleQueueName) != null), 2000, 200)); assertTrue(server.getAddressInfo(simpleQueueName).getRoutingTypes().contains(RoutingType.ANYCAST)); assertEquals(RoutingType.ANYCAST, server.locateQueue(simpleQueueName).getRoutingType()); }