use of com.swiftmq.swiftlet.topic.TopicException in project swiftmq-ce by iitsoftware.
the class TopicManagerImpl method deleteTopic.
public synchronized void deleteTopic(String topicName) throws TopicException {
if (!isTopicDefined(topicName))
throw new TopicException("Topic '" + topicName + "' is unknown");
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(getName(), "deleteTopic: deleting topic: " + topicName);
ctx.logSwiftlet.logInformation(getName(), "delete topic: " + topicName);
String[] tokenizedName = tokenizeTopicName(topicName, TOPIC_DELIMITER);
String rootName = TOPIC_PREFIX + tokenizedName[0];
TopicBroker rootBroker = (TopicBroker) rootBrokers.get(rootName);
rootBroker.removeTopic(topicName, tokenizedName);
if (ctx.jndiSwiftlet != null)
ctx.jndiSwiftlet.deregisterJNDIObject(topicName);
}
use of com.swiftmq.swiftlet.topic.TopicException in project swiftmq-ce by iitsoftware.
the class TopicManagerImpl method createTopicAdministratively.
private synchronized void createTopicAdministratively(String topicName) throws TopicException {
if (isTopicDefined(topicName))
throw new TopicException("Topic '" + topicName + "' is already defined");
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(getName(), "createTopic: creating topic: " + topicName);
ctx.logSwiftlet.logInformation(getName(), "create topic: " + topicName);
String[] tokenizedName = tokenizeTopicName(topicName, TOPIC_DELIMITER);
String rootName = TOPIC_PREFIX + tokenizedName[0];
TopicBroker rootBroker = (TopicBroker) rootBrokers.get(rootName);
if (rootBroker == null) {
try {
ctx.queueManager.createQueue(rootName, this);
} catch (Exception e) {
throw new TopicException(e.getMessage());
}
rootBroker = (TopicBroker) rootBrokers.get(rootName);
}
rootBroker.addTopic(topicName, tokenizedName);
if (ctx.jndiSwiftlet != null)
registerJNDI(topicName, new TopicImpl(topicName));
}
use of com.swiftmq.swiftlet.topic.TopicException in project swiftmq-ce by iitsoftware.
the class SourceLink method verifyLocalAddress.
public void verifyLocalAddress() throws AuthenticationException, QueueException, TopicException, InvalidSelectorException {
if (!dynamic) {
// This is for the case of reconnecting to a Durable Subscriber without specifying a Source in the attach frame.
if (localAddress == null) {
String topicName = ctx.topicManager.getDurableTopicName(getName(), mySessionHandler.getVersionedConnection().getActiveLogin());
if (topicName != null)
localAddress = new AddressString(topicName);
durability = TerminusDurability.CONFIGURATION;
}
super.verifyLocalAddress();
}
if (receiver == null) {
MessageSelector msel = null;
if (messageSelector != null) {
msel = new MessageSelector(messageSelector);
msel.compile();
}
if (dynamic) {
expiryPolicy = TerminusExpiryPolicy.LINK_DETACH;
durability = TerminusDurability.NONE;
// sndSettleMode = SenderSettleMode.SETTLED.getValue(); // SETTLED is only possible with temp queues because bulk mode in message proc do not delete from persistent store
queueName = ctx.queueManager.createTemporaryQueue();
receiver = ctx.queueManager.createQueueReceiver(queueName, mySessionHandler.getVersionedConnection().getActiveLogin(), msel);
} else {
if (isQueue) {
expiryPolicy = TerminusExpiryPolicy.LINK_DETACH;
durability = TerminusDurability.CONFIGURATION;
// sndSettleMode = SenderSettleMode.UNSETTLED.getValue();
receiver = ctx.queueManager.createQueueReceiver(getLocalAddress().getValueString(), mySessionHandler.getVersionedConnection().getActiveLogin(), msel);
} else {
if (durability.getValue() == TerminusDurability.CONFIGURATION.getValue() || durability.getValue() == TerminusDurability.UNSETTLED_STATE.getValue()) {
if (!expiryPolicy.getValue().equals(TerminusExpiryPolicy.LINK_DETACH.getValue()))
expiryPolicy = TerminusExpiryPolicy.NEVER;
durability = TerminusDurability.CONFIGURATION;
// sndSettleMode = SenderSettleMode.UNSETTLED.getValue();
queueName = ctx.topicManager.subscribeDurable(name, (TopicImpl) getLocalDestination(), msel, noLocal, mySessionHandler.getVersionedConnection().getActiveLogin());
} else {
expiryPolicy = TerminusExpiryPolicy.LINK_DETACH;
queueName = ctx.queueManager.createTemporaryQueue();
// sndSettleMode = SenderSettleMode.SETTLED.getValue(); // SETTLED is only possible with temp queues because bulk mode in message proc do not delete from persistent store
subscriberId = ctx.topicManager.subscribe((TopicImpl) localDestination, msel, noLocal, queueName, mySessionHandler.getVersionedConnection().getActiveLogin());
}
receiver = ctx.queueManager.createQueueReceiver(queueName, mySessionHandler.getVersionedConnection().getActiveLogin(), null);
}
}
}
if (remoteUnsettled != null) {
final AbstractQueue aq = ctx.queueManager.getQueueForInternalUse(receiver.getQueueName());
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(ctx.amqpSwiftlet.getName(), toString() + "/recovery, abstractQueue=" + aq);
DataByteArrayInputStream dbis = new DataByteArrayInputStream();
for (Iterator iter = remoteUnsettled.entrySet().iterator(); iter.hasNext(); ) {
Map.Entry entry = (Map.Entry) iter.next();
AMQPBinary deliveryTag = (AMQPBinary) entry.getKey();
DeliveryStateIF deliveryStateIF = null;
try {
deliveryStateIF = DeliveryStateFactory.create((AMQPList) entry.getValue());
} catch (Exception e) {
throw new QueueException("Unable to create delivery tag");
}
final MessageIndex messageIndex = new MessageIndex();
dbis.setBuffer(deliveryTag.getValue());
try {
messageIndex.readContent(dbis);
} catch (IOException e) {
throw new QueueException("Unable to convert delivery tag into a message index");
}
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(ctx.amqpSwiftlet.getName(), toString() + "/recovery, messageIndex=" + messageIndex + ", deliveryStateIF=" + deliveryStateIF);
if (deliveryStateIF != null) {
deliveryStateIF.accept(new DeliveryStateVisitorAdapter() {
public void visit(Accepted accepted) {
try {
if (aq != null) {
MessageIndex indexEntry = aq.getIndexEntry(messageIndex);
if (indexEntry != null) {
aq.removeMessageByIndex(indexEntry);
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(ctx.amqpSwiftlet.getName(), toString() + "/recovery, messageIndex=" + indexEntry + ", removed");
} else {
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(ctx.amqpSwiftlet.getName(), toString() + "/recovery, messageIndex=" + messageIndex + ", NOT FOUND!");
}
}
} catch (QueueException e) {
e.printStackTrace();
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(ctx.amqpSwiftlet.getName(), toString() + "/recovery, messageIndex=" + messageIndex + ", exception=" + e);
}
}
});
}
}
}
}
use of com.swiftmq.swiftlet.topic.TopicException in project swiftmq-ce by iitsoftware.
the class TopicManagerImpl method subscribeDurable.
private synchronized String subscribeDurable(String durableName, TopicImpl topic, Selector selector, boolean noLocal, ActiveLogin activeLogin, Entity newEntity, boolean verifyAuth) throws AuthenticationException, QueueException, QueueAlreadyDefinedException, UnknownQueueException, TopicException {
String topicName = null;
try {
topicName = topic.getTopicName();
} catch (JMSException ignored) {
}
if (verifyAuth)
ctx.authSwiftlet.verifyTopicDurableSubscriberCreation(topicName, activeLogin.getLoginId());
String durableQueueName = DurableSubscription.createDurableQueueName(activeLogin.getClientId(), durableName);
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(getName(), "subscribeDurable: topic = " + topicName + ", durableQueueName = " + durableQueueName);
DurableSubscription durable = (DurableSubscription) durableSubscriptions.get(durableQueueName);
if (durable != null && durable.hasChanged(topicName, selector, noLocal)) {
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(getName(), "subscribeDurable: durable has changed, deleting ...");
unsubscribe(durable.getTopicSubscription().getSubscriberId());
ctx.queueManager.purgeQueue(durableQueueName);
ctx.queueManager.deleteQueue(durableQueueName, false);
durableSubscriptions.remove(durableQueueName);
try {
durableStore.deleteDurableStoreEntry(durable.getClientId(), durable.getDurableName());
} catch (Exception e) {
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(getName(), "subscribeDurable: error deleting durable subscription: " + e);
throw new TopicException("error deleting durable subscription: " + e);
}
durable = null;
ctx.activeDurableList.removeDynamicEntity(durable);
}
if (durable == null) {
durable = new DurableSubscription(activeLogin.getClientId(), durableName, topicName, selector, noLocal);
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(getName(), "subscribeDurable: creating new durable = " + durable);
durableSubscriptions.put(durableQueueName, durable);
try {
durableStore.insertDurableStoreEntry(durable.getDurableStoreEntry());
} catch (Exception e) {
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(getName(), "subscribeDurable: error saving durable subscription: " + e);
throw new TopicException("error saving durable subscription: " + e);
}
ctx.queueManager.createQueue(durableQueueName, (ActiveLogin) null);
int id = subscribe(topic, selector, noLocal, durableQueueName, activeLogin);
durable.setTopicSubscription((TopicSubscription) topicSubscriptions.get(id));
try {
if (newEntity == null) {
Entity durEntity = ctx.activeDurableList.createEntity();
durEntity.setName(durableQueueName);
durEntity.setDynamicObject(durable);
durEntity.createCommands();
Property prop = durEntity.getProperty("clientid");
prop.setValue(activeLogin.getClientId());
prop.setReadOnly(true);
prop = durEntity.getProperty("durablename");
prop.setValue(durableName);
prop.setReadOnly(true);
prop = durEntity.getProperty("topic");
prop.setValue(topicName);
prop.setReadOnly(true);
prop = durEntity.getProperty("boundto");
prop.setValue(durableQueueName);
prop.setReadOnly(true);
prop = durEntity.getProperty("nolocal");
prop.setValue(new Boolean(noLocal));
prop.setReadOnly(true);
prop = durEntity.getProperty("selector");
if (selector != null) {
prop.setValue(selector.getConditionString());
}
prop.setReadOnly(true);
programmaticDurableInProgress = true;
ctx.activeDurableList.addEntity(durEntity);
programmaticDurableInProgress = false;
} else {
newEntity.setDynamicObject(durable);
Property prop = newEntity.getProperty("boundto");
prop.setValue(durableQueueName);
prop.setReadOnly(true);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return durableQueueName;
}
use of com.swiftmq.swiftlet.topic.TopicException in project swiftmq-ce by iitsoftware.
the class TopicManagerImpl method createTopic.
public synchronized void createTopic(String topicName) throws TopicException {
if (isTopicDefined(topicName))
throw new TopicException("Topic '" + topicName + "' is already defined");
if (ctx.traceSpace.enabled)
ctx.traceSpace.trace(getName(), "createTopic: creating topic: " + topicName);
ctx.logSwiftlet.logInformation(getName(), "create topic: " + topicName);
String[] tokenizedName = tokenizeTopicName(topicName, TOPIC_DELIMITER);
String rootName = TOPIC_PREFIX + tokenizedName[0];
TopicBroker rootBroker = (TopicBroker) rootBrokers.get(rootName);
if (rootBroker == null) {
try {
ctx.queueManager.createQueue(rootName, this);
} catch (Exception e) {
throw new TopicException(e.getMessage());
}
rootBroker = (TopicBroker) rootBrokers.get(rootName);
}
rootBroker.addTopic(topicName, tokenizedName);
if (ctx.jndiSwiftlet != null)
registerJNDI(topicName, new TopicImpl(topicName));
}
Aggregations