Search in sources :

Example 1 with StructuredProxyPushSupplier

use of org.omg.CosNotifyChannelAdmin.StructuredProxyPushSupplier in project ACS by ACS-Community.

the class NCSubscriber method createProxySupplier.

/**
	 * Creates the proxy supplier (push-style, for structured events) 
	 * that lives in the Notify server process, managed by the consumer admin object, and
	 * will later be connected to this client-side subscriber object.
	 * 
	 * @throws AcsJCORBAProblemEx If creation of the proxy supplier failed.
	 */
private StructuredProxyPushSupplier createProxySupplier() throws AcsJCORBAProblemEx {
    StructuredProxyPushSupplier ret = null;
    String errMsg = null;
    // will get assigned "a numeric identifier [...] that is unique among all proxy suppliers [the admin object] has created"
    IntHolder proxyIdHolder = new IntHolder();
    String randomizedClientName = null;
    try {
        ProxySupplier proxy = null;
        while (proxy == null) {
            // See the comments on Consumer#createConsumer() for a nice explanation of why this randomness is happening here
            randomizedClientName = Helper.createRandomizedClientName(clientName);
            try {
                proxy = sharedConsumerAdmin.obtain_named_notification_push_supplier(ClientType.STRUCTURED_EVENT, proxyIdHolder, randomizedClientName);
            } 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.
            } catch (NameMapError e) {
                // Default to the unnamed version
                proxy = sharedConsumerAdmin.obtain_notification_push_supplier(ClientType.STRUCTURED_EVENT, proxyIdHolder);
            }
        }
        ret = StructuredProxyPushSupplierHelper.narrow(proxy);
    } catch (AdminLimitExceeded ex) {
        // See NC spec 3.4.15.10
        // If the number of consumers currently connected to the channel with which the target ConsumerAdmin object is associated 
        // exceeds the value of the MaxConsumers administrative property, the AdminLimitExceeded exception is raised.
        String limit = ex.admin_property_err.value.extract_string();
        errMsg = "NC '" + channelName + "' is configured for a maximum of " + limit + " subscribers, which does not allow this client to subscribe.";
    }
    if (ret != null) {
        LOG_NC_SupplierProxyCreation_OK.log(logger, proxyIdHolder.value, clientName, randomizedClientName, channelName, getNotificationFactoryName());
    } else {
        LOG_NC_SupplierProxyCreation_FAIL.log(logger, clientName, channelName, getNotificationFactoryName(), errMsg);
        AcsJCORBAProblemEx ex2 = new AcsJCORBAProblemEx();
        ex2.setInfo("Failed to create proxy supplier on NC '" + channelName + "' for client '" + clientName + "': " + errMsg);
        throw ex2;
    }
    return ret;
}
Also used : AcsJCORBAProblemEx(alma.ACSErrTypeCommon.wrappers.AcsJCORBAProblemEx) NameMapError(gov.sandia.NotifyMonitoringExt.NameMapError) AdminLimitExceeded(org.omg.CosNotifyChannelAdmin.AdminLimitExceeded) IntHolder(org.omg.CORBA.IntHolder) ProxySupplier(org.omg.CosNotifyChannelAdmin.ProxySupplier) NameAlreadyUsed(gov.sandia.NotifyMonitoringExt.NameAlreadyUsed) StructuredProxyPushSupplier(org.omg.CosNotifyChannelAdmin.StructuredProxyPushSupplier)

Aggregations

AcsJCORBAProblemEx (alma.ACSErrTypeCommon.wrappers.AcsJCORBAProblemEx)1 NameAlreadyUsed (gov.sandia.NotifyMonitoringExt.NameAlreadyUsed)1 NameMapError (gov.sandia.NotifyMonitoringExt.NameMapError)1 IntHolder (org.omg.CORBA.IntHolder)1 AdminLimitExceeded (org.omg.CosNotifyChannelAdmin.AdminLimitExceeded)1 ProxySupplier (org.omg.CosNotifyChannelAdmin.ProxySupplier)1 StructuredProxyPushSupplier (org.omg.CosNotifyChannelAdmin.StructuredProxyPushSupplier)1