PostOffice po = serverPeer.getPostOfficeInstance();
Binding binding = po.getBindingForQueueName(destination.getName());
Queue queue;
if (binding != null)
{
queue = binding.queue;
if (queue.isActive())
{
throw new IllegalStateException("Cannot deploy queue " + destination.getName() + " it is already deployed");
}
//Sanity check - currently it is not possible to change the clustered attribute of a destination
//See http://jira.jboss.org/jira/browse/JBMESSAGING-1235
boolean actuallyClustered = po.isClustered() && destination.isClustered();
if (actuallyClustered != queue.isClustered())
{
throw new IllegalArgumentException("Queue " + destination.getName() + " is already deployed as clustered = " +
queue.isClustered() + " so cannot redeploy as clustered=" + destination.isClustered() +
" . You must delete the destination first before redeploying");
}
queue.setPagingParams(destination.getFullSize(),
destination.getPageSize(),
destination.getDownCacheSize());
queue.load();
// Must be done after load
queue.setMaxSize(destination.getMaxSize());
queue.activate();
}
else
{
// Create a new queue
JMSCondition queueCond = new JMSCondition(true, destination.getName());
queue = new MessagingQueue(nodeId, destination.getName(),
serverPeer.getChannelIDManager().getID(),
serverPeer.getMessageStore(), serverPeer.getPersistenceManagerInstance(),
true,
destination.getMaxSize(), null,
destination.getFullSize(), destination.getPageSize(),
destination.getDownCacheSize(), destination.isClustered(),
serverPeer.getRecoverDeliveriesTimeout());
po.addBinding(new Binding(queueCond, queue, false), false);
queue.activate();
}
((ManagedQueue)destination).setQueue(queue);
String counterName = QUEUE_MESSAGECOUNTER_PREFIX + destination.getName();
int dayLimitToUse = destination.getMessageCounterHistoryDayLimit();
if (dayLimitToUse == -1)
{
//Use override on server peer
dayLimitToUse = serverPeer.getDefaultMessageCounterHistoryDayLimit();
}
MessageCounter counter =
new MessageCounter(counterName, null, queue, false, false,
dayLimitToUse);
((ManagedQueue)destination).setMessageCounter(counter);
serverPeer.getMessageCounterManager().registerMessageCounter(counterName, counter);
serverPeer.getDestinationManager().registerDestination(destination);
log.debug(this + " security configuration: " + (destination.getSecurityConfig() == null ?
"null" : "\n" + XMLUtil.elementToString(destination.getSecurityConfig())));
started = true;
//Now we need to trigger a delivery - this is because message suckers might have
//been create *before* the queue was deployed - this is because message suckers can be
//created when the clusterpullconnectionfactory deploy is detected which then causes
//the clusterconnectionmanager to inspect the bindings for queues to create suckers
//to - but these bindings will exist before the queue or topic is deployed and before
//it has had its messages loaded
//Therefore we need to trigger a delivery now so remote suckers get messages
//See http://jira.jboss.org/jira/browse/JBMESSAGING-1136
//For JBM we should remove the distinction between activation and deployment to
//remove these annoyances and edge cases.
//The post office should load(=deploy) all bindings on startup including loading their
//state before adding the binding - there should be no separate deployment stage
//If the queue can be undeployed there should be a separate flag for this on the
//binding
queue.deliver();
log.info(this + " started, fullSize=" + destination.getFullSize() +
", pageSize=" + destination.getPageSize() + ", downCacheSize=" + destination.getDownCacheSize());
}
catch (Throwable t)