}
// see if we are a wildcard destination
DestinationUID dest_uid = null;
Destination d = null;
if (DestinationUID.isWildcard(destination)) { // dont create a destination
dest_uid = DestinationUID.getUID(destination, DestType.isQueue(type));
} else {
d = null;
while (true ) {
d = Destination.getDestination(destination,
type, true /* autocreate if possible*/,
!con.isAdminConnection());
if (d.isAutoCreated())
warning = BrokerResources.W_ADD_AUTO_CONSUMER_FAILED;
try {
if (d != null)
d.incrementRefCount();
} catch (BrokerException ex) {
continue; // was destroyed in process
} catch (IllegalStateException ex) {
throw new BrokerException(
Globals.getBrokerResources().getKString(
BrokerResources.X_SHUTTING_DOWN_BROKER),
BrokerResources.X_SHUTTING_DOWN_BROKER,
ex,
Status.ERROR);
}
break; // we got one
}
if (d == null) {
// unable to autocreate destination
status = Status.NOT_FOUND;
// XXX error
throw new BrokerException(
Globals.getBrokerResources().getKString(
BrokerResources.X_DESTINATION_NOT_FOUND, destination),
BrokerResources.X_DESTINATION_NOT_FOUND,
null,
Status.NOT_FOUND);
}
dest_uid = d.getDestinationUID();
}
// Must have a clientID to add a durable
if (durablename != null && clientid == null) {
throw new BrokerException(
Globals.getBrokerResources().getKString(
BrokerResources.X_NO_CLIENTID, durablename),
BrokerResources.X_NO_CLIENTID,
null,
Status.PRECONDITION_FAILED);
}
Consumer c = null;
try {
//LKS
Consumer[] retc = createConsumer( dest_uid, con,
session, selector, clientid,
durablename, (nolocal != null && nolocal.booleanValue()),
(size == null ? -1 : size.intValue()),
(share != null && share.booleanValue()),
msg.getSysMessageID().toString(), isIndemp, true);
c = retc[0];
newc = retc[1];
sub = (Subscription)retc[2];
if (c.getPrefetch() != -1 || size != null)
hash.put("JMQSize", c.getPrefetch());
} catch (SelectorFormatException ex) {
throw new BrokerException(
Globals.getBrokerResources().getKString(
BrokerResources.W_SELECTOR_PARSE, selector),
BrokerResources.W_SELECTOR_PARSE,
ex,
Status.BAD_REQUEST);
} catch (OutOfLimitsException ex) {
if (d != null && d.isQueue()) {
String args[] = { dest_uid.getName(),
String.valueOf(d.getActiveConsumerCount()),
String.valueOf(d.getFailoverConsumerCount()) };
throw new BrokerException(
Globals.getBrokerResources().getKString(
BrokerResources.X_S_QUEUE_ATTACH_FAILED, args),
BrokerResources.X_S_QUEUE_ATTACH_FAILED,
ex,
Status.CONFLICT);
} else { // durable
String args[] = { dest_uid.getName(),
durablename, clientid,
String.valueOf(ex.getLimit()) };
throw new BrokerException(
Globals.getBrokerResources().getKString(
BrokerResources.X_S_DUR_ATTACH_FAILED, args),