use of org.omg.CosEventChannelAdmin.AlreadyConnected in project ACS by ACS-Community.
the class NCPublisher method init.
/**
* Initializes NCPublisher
* @param namingService Naming service
* @throws AcsJException
* There are literally dozens of CORBA exceptions that could be
* thrown by the NCPublisher class. Instead, these are
* converted into an ACS Error System exception for the
* developer's convenience.
*/
protected synchronized void init(NamingContext namingService) throws AcsJException {
helper = new Helper(channelName, channelNotifyServiceDomainName, this.services, namingService);
isTraceEventsEnabled = helper.getChannelProperties().isTraceEventsEnabled(this.channelName);
// get the channel
// @TODO: handle Corba TIMEOUT
channel = helper.getNotificationChannel(getNotificationFactoryName());
// Corba NC spec about adminId: a unique identifier assigned by the target EventChannel instance that is unique among all
// SupplierAdmin instances currently associated with the channel.
// We are currently not using it, but it could be logged to help with NC debugging.
IntHolder adminIdHolder = new IntHolder();
org.omg.CosNotifyChannelAdmin.SupplierAdmin supplierAdminBase = null;
try {
supplierAdminBase = channel.new_for_suppliers(InterFilterGroupOperator.AND_OP, adminIdHolder);
} catch (TIMEOUT ex) {
// found in http://jira.alma.cl/browse/COMP-6312
throw new AcsJCORBAProblemEx(ex);
}
if (supplierAdminBase == null) {
AcsJCORBAReferenceNilEx ex = new AcsJCORBAReferenceNilEx();
ex.setVariable("supplierAdminBase");
ex.setContext("Null reference obtained for the supplier admin for channel " + this.channelName);
throw ex;
}
try {
supplierAdmin = gov.sandia.NotifyMonitoringExt.SupplierAdminHelper.narrow(supplierAdminBase);
} catch (BAD_PARAM ex) {
// This should never happen, since we already enforced the presence of TAO extensions in Helper#initializeNotifyFactory
String specialSupplierAdminId = gov.sandia.NotifyMonitoringExt.SupplierAdminHelper.id();
String standardSupplierAdminId = org.omg.CosNotifyChannelAdmin.SupplierAdminHelper.id();
LOG_NC_TaoExtensionsSubtypeMissing.log(logger, channelName + "-SupplierAdmin", specialSupplierAdminId, standardSupplierAdminId);
AcsJNarrowFailedEx ex2 = new AcsJNarrowFailedEx(ex);
ex2.setNarrowType(specialSupplierAdminId);
throw ex2;
}
int proxyCreationAttempts = 0;
while (proxyConsumer == null) {
String randomizedClientName = Helper.createRandomizedClientName(services.getName());
// Holder for the unique ID assigned by the admin object. It is different from the name we set, and will be discarded.
IntHolder proxyIdHolder = new IntHolder();
proxyCreationAttempts++;
try {
// Create the consumer proxy (to which the published events will be fed) with a name.
// The client type parameter selects a StructuredProxyPushConsumer (based on Structured Events),
// as opposed to ProxyPushConsumer (based on Anys), or SequenceProxyPushConsumer (based on sequences of Structured Events).
org.omg.CORBA.Object tempCorbaObj = supplierAdmin.obtain_named_notification_push_consumer(ClientType.STRUCTURED_EVENT, proxyIdHolder, randomizedClientName.toString());
if (tempCorbaObj == null) {
AcsJCORBAReferenceNilEx ex = new AcsJCORBAReferenceNilEx();
ex.setVariable("tempCorbaObj");
ex.setContext("Null reference obtained for the Proxy Push Consumer for publisher " + services.getName());
// @TODO destroy supplierAdmin
throw ex;
}
proxyConsumer = StructuredProxyPushConsumerHelper.narrow(tempCorbaObj);
LOG_NC_ConsumerProxyCreation_OK.log(logger, proxyIdHolder.value, randomizedClientName, proxyCreationAttempts, services.getName(), channelName, getNotificationFactoryName());
} catch (NameAlreadyUsed e) {
// Hopefully we won't run into this situation. Still, try to go on in the loop,
// with a different client name next time.
logger.fine("Consumer proxy name '" + randomizedClientName + "' already in use. Will try again with different random number appended.");
} catch (NameMapError ex) {
// Default to the unnamed version
try {
proxyConsumer = StructuredProxyPushConsumerHelper.narrow(supplierAdmin.obtain_notification_push_consumer(ClientType.STRUCTURED_EVENT, proxyIdHolder));
LOG_NC_ConsumerProxyCreation_OK.log(logger, proxyIdHolder.value, "-unknown-", proxyCreationAttempts, services.getName(), channelName, getNotificationFactoryName());
} catch (AdminLimitExceeded ex2) {
LOG_NC_ConsumerProxyCreation_FAIL.log(logger, services.getName(), channelName, getNotificationFactoryName(), ex2.getMessage());
// @TODO destroy supplierAdmin
throw new AcsJCORBAProblemEx(ex2);
}
} catch (AdminLimitExceeded e) {
LOG_NC_ConsumerProxyCreation_FAIL.log(logger, services.getName(), channelName, getNotificationFactoryName(), e.getMessage());
// @TODO destroy supplierAdmin
throw new AcsJCORBAProblemEx(e);
}
}
// Avoid future calls from the NC to #subscription_change(EventType[], EventType[]). See Corba spec 3.4.1.3
// @TODO: If we use ALL_NOW_UPDATES_ON then we could actually suppress sending of event types that no consumer wants to get.
proxyConsumer.obtain_subscription_types(ObtainInfoMode.NONE_NOW_UPDATES_OFF);
// see 3.4.4.1 of Notification Service, v1.1
try {
StructuredPushSupplier thisSps = StructuredPushSupplierHelper.narrow(this.services.activateOffShoot(this));
proxyConsumer.connect_structured_push_supplier(thisSps);
} catch (AcsJContainerServicesEx e) {
// @TODO destroy supplierAdmin and proxyConsumer
throw new AcsJCORBAProblemEx(e);
} catch (AlreadyConnected e) {
// @TODO destroy supplierAdmin and proxyConsumer
throw new AcsJCORBAProblemEx(e);
}
reconnectCallback = new AcsNcReconnectionCallback(this, logger);
reconnectCallback.registerForReconnect(services, helper.getNotifyFactory());
}
Aggregations