Search in sources :

Example 1 with ServiceDynamicLoadbalanceEndpoint

use of org.apache.synapse.endpoints.ServiceDynamicLoadbalanceEndpoint in project wso2-synapse by wso2.

the class ServiceDynamicLoadbalanceEndpointSerializer method serializeEndpoint.

protected OMElement serializeEndpoint(Endpoint endpoint) {
    if (!(endpoint instanceof ServiceDynamicLoadbalanceEndpoint)) {
        handleException("Invalid endpoint type.");
    }
    fac = OMAbstractFactory.getOMFactory();
    OMElement endpointElement = fac.createOMElement("endpoint", SynapseConstants.SYNAPSE_OMNAMESPACE);
    ServiceDynamicLoadbalanceEndpoint dynamicLoadbalanceEndpoint = (ServiceDynamicLoadbalanceEndpoint) endpoint;
    // serialize the parameters
    serializeProperties(dynamicLoadbalanceEndpoint, endpointElement);
    serializeCommonAttributes(endpoint, endpointElement);
    Dispatcher dispatcher = dynamicLoadbalanceEndpoint.getDispatcher();
    if (dispatcher != null) {
        OMElement sessionElement = fac.createOMElement("session", SynapseConstants.SYNAPSE_OMNAMESPACE);
        if (dispatcher instanceof SoapSessionDispatcher) {
            sessionElement.addAttribute("type", "soap", null);
        } else if (dispatcher instanceof HttpSessionDispatcher) {
            sessionElement.addAttribute("type", "http", null);
        } else if (dispatcher instanceof SimpleClientSessionDispatcher) {
            sessionElement.addAttribute("type", "simpleClientSession", null);
        } else {
            handleException("invalid session dispatcher : " + dispatcher.getClass().getName());
        }
        long sessionTimeout = dynamicLoadbalanceEndpoint.getSessionTimeout();
        if (sessionTimeout != -1) {
            OMElement sessionTimeoutElement = fac.createOMElement("sessionTimeout", SynapseConstants.SYNAPSE_OMNAMESPACE);
            sessionTimeoutElement.setText(String.valueOf(sessionTimeout));
            sessionElement.addChild(sessionTimeoutElement);
        }
        endpointElement.addChild(sessionElement);
    }
    OMElement dynamicLoadbalanceElement = fac.createOMElement("serviceDynamicLoadbalance", SynapseConstants.SYNAPSE_OMNAMESPACE);
    endpointElement.addChild(dynamicLoadbalanceElement);
    // Load balance algorithm
    dynamicLoadbalanceElement.addAttribute(XMLConfigConstants.LOADBALANCE_ALGORITHM, dynamicLoadbalanceEndpoint.getAlgorithm().getClass().getName(), null);
    // Host-domain map
    OMElement servicesEle = fac.createOMElement("services", SynapseConstants.SYNAPSE_OMNAMESPACE);
    dynamicLoadbalanceElement.addChild(servicesEle);
    Map<String, String> hostDomainMap = dynamicLoadbalanceEndpoint.getHostDomainMap();
    for (Map.Entry<String, String> entry : hostDomainMap.entrySet()) {
        OMElement serviceEle = fac.createOMElement("service", SynapseConstants.SYNAPSE_OMNAMESPACE);
        servicesEle.addChild(serviceEle);
        OMElement hostEle = fac.createOMElement("host", SynapseConstants.SYNAPSE_OMNAMESPACE);
        hostEle.setText(entry.getKey());
        serviceEle.addChild(hostEle);
        OMElement domainEle = fac.createOMElement("domain", SynapseConstants.SYNAPSE_OMNAMESPACE);
        domainEle.setText(entry.getValue());
        serviceEle.addChild(domainEle);
    }
    return endpointElement;
}
Also used : ServiceDynamicLoadbalanceEndpoint(org.apache.synapse.endpoints.ServiceDynamicLoadbalanceEndpoint) OMElement(org.apache.axiom.om.OMElement) HttpSessionDispatcher(org.apache.synapse.endpoints.dispatch.HttpSessionDispatcher) SoapSessionDispatcher(org.apache.synapse.endpoints.dispatch.SoapSessionDispatcher) Dispatcher(org.apache.synapse.endpoints.dispatch.Dispatcher) SimpleClientSessionDispatcher(org.apache.synapse.endpoints.dispatch.SimpleClientSessionDispatcher) SimpleClientSessionDispatcher(org.apache.synapse.endpoints.dispatch.SimpleClientSessionDispatcher) HttpSessionDispatcher(org.apache.synapse.endpoints.dispatch.HttpSessionDispatcher) Map(java.util.Map) SoapSessionDispatcher(org.apache.synapse.endpoints.dispatch.SoapSessionDispatcher)

Example 2 with ServiceDynamicLoadbalanceEndpoint

use of org.apache.synapse.endpoints.ServiceDynamicLoadbalanceEndpoint in project wso2-synapse by wso2.

the class ServiceDynamicLoadbalanceEndpointFactory method createEndpoint.

protected Endpoint createEndpoint(OMElement epConfig, boolean anonymousEndpoint, Properties properties) {
    OMElement loadbalanceElement = epConfig.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "serviceDynamicLoadbalance"));
    if (loadbalanceElement == null) {
        return null;
    }
    String configuration = loadbalanceElement.getAttributeValue(new QName(XMLConfigConstants.NULL_NAMESPACE, "configuration"));
    OMElement servicesEle;
    if (configuration != null) {
        if (configuration.startsWith("$system:")) {
            configuration = System.getProperty(configuration.substring("$system:".length()));
        }
        // Load the file
        StAXOMBuilder builder = null;
        try {
            builder = new StAXOMBuilder(new URL(configuration).openStream());
        } catch (Exception e) {
            handleException("Could not load ServiceDynamicLoadbalanceEndpoint configuration file " + configuration);
        }
        servicesEle = builder.getDocumentElement().getFirstChildWithName(SERVICES_QNAME);
    } else {
        OMElement lbConfigEle = loadbalanceElement.getFirstChildWithName(LB_CONFIG_QNAME);
        if (lbConfigEle == null) {
            throw new RuntimeException("loadBalancerConfig element not found as a child of " + "serviceDynamicLoadbalance element");
        }
        servicesEle = lbConfigEle.getFirstChildWithName(SERVICES_QNAME);
    }
    if (servicesEle == null) {
        throw new RuntimeException("services element not found in serviceDynamicLoadbalance configuration");
    }
    Map<String, String> hostDomainMap = new HashMap<String, String>();
    for (Iterator<OMElement> iter = servicesEle.getChildrenWithLocalName("service"); iter.hasNext(); ) {
        OMElement serviceEle = iter.next();
        OMElement hostsEle = serviceEle.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "hosts"));
        if (hostsEle == null) {
            throw new RuntimeException("hosts element not found as a child of service element");
        }
        List<String> hosts = new ArrayList<String>();
        for (Iterator<OMElement> hostIter = hostsEle.getChildrenWithLocalName("host"); hostIter.hasNext(); ) {
            OMElement hostEle = hostIter.next();
            String host = hostEle.getText();
            if (host.trim().length() == 0) {
                throw new RuntimeException("host cannot be null");
            }
            hosts.add(host);
        }
        OMElement domainEle = serviceEle.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "domain"));
        if (domainEle == null) {
            throw new RuntimeException("domain element not found in as a child of services");
        }
        String domain = domainEle.getText();
        if (domain.trim().length() == 0) {
            throw new RuntimeException("domain cannot be null");
        }
        for (String host : hosts) {
            if (hostDomainMap.containsKey(host)) {
                throw new RuntimeException("host " + host + " has been already defined for " + "clustering domain " + hostDomainMap.get(host));
            }
            hostDomainMap.put(host, domain);
        }
    }
    if (hostDomainMap.isEmpty()) {
        throw new RuntimeException("No service elements defined under services");
    }
    LoadbalanceAlgorithm algorithm = LoadbalanceAlgorithmFactory.createLoadbalanceAlgorithm(loadbalanceElement, null);
    ServiceDynamicLoadbalanceEndpoint loadbalanceEndpoint = new ServiceDynamicLoadbalanceEndpoint(hostDomainMap, algorithm);
    // set endpoint name
    OMAttribute name = epConfig.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "name"));
    if (name != null) {
        loadbalanceEndpoint.setName(name.getAttributeValue());
    }
    // get the session for this endpoint
    OMElement sessionElement = epConfig.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "session"));
    if (sessionElement != null) {
        OMElement sessionTimeout = sessionElement.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "sessionTimeout"));
        if (sessionTimeout != null) {
            try {
                loadbalanceEndpoint.setSessionTimeout(Long.parseLong(sessionTimeout.getText().trim()));
            } catch (NumberFormatException nfe) {
                handleException("Invalid session timeout value : " + sessionTimeout.getText());
            }
        }
        String type = sessionElement.getAttributeValue(new QName("type"));
        if (type.equalsIgnoreCase("soap")) {
            Dispatcher soapDispatcher = new SoapSessionDispatcher();
            loadbalanceEndpoint.setDispatcher(soapDispatcher);
        } else if (type.equalsIgnoreCase("http")) {
            Dispatcher httpDispatcher = new HttpSessionDispatcher();
            loadbalanceEndpoint.setDispatcher(httpDispatcher);
        }
        loadbalanceEndpoint.setSessionAffinity(true);
    }
    loadbalanceEndpoint.setFailover(false);
    return loadbalanceEndpoint;
}
Also used : QName(javax.xml.namespace.QName) OMElement(org.apache.axiom.om.OMElement) SoapSessionDispatcher(org.apache.synapse.endpoints.dispatch.SoapSessionDispatcher) Dispatcher(org.apache.synapse.endpoints.dispatch.Dispatcher) HttpSessionDispatcher(org.apache.synapse.endpoints.dispatch.HttpSessionDispatcher) URL(java.net.URL) ServiceDynamicLoadbalanceEndpoint(org.apache.synapse.endpoints.ServiceDynamicLoadbalanceEndpoint) LoadbalanceAlgorithm(org.apache.synapse.endpoints.algorithms.LoadbalanceAlgorithm) StAXOMBuilder(org.apache.axiom.om.impl.builder.StAXOMBuilder) OMAttribute(org.apache.axiom.om.OMAttribute) HttpSessionDispatcher(org.apache.synapse.endpoints.dispatch.HttpSessionDispatcher) SoapSessionDispatcher(org.apache.synapse.endpoints.dispatch.SoapSessionDispatcher)

Aggregations

OMElement (org.apache.axiom.om.OMElement)2 ServiceDynamicLoadbalanceEndpoint (org.apache.synapse.endpoints.ServiceDynamicLoadbalanceEndpoint)2 Dispatcher (org.apache.synapse.endpoints.dispatch.Dispatcher)2 HttpSessionDispatcher (org.apache.synapse.endpoints.dispatch.HttpSessionDispatcher)2 SoapSessionDispatcher (org.apache.synapse.endpoints.dispatch.SoapSessionDispatcher)2 URL (java.net.URL)1 Map (java.util.Map)1 QName (javax.xml.namespace.QName)1 OMAttribute (org.apache.axiom.om.OMAttribute)1 StAXOMBuilder (org.apache.axiom.om.impl.builder.StAXOMBuilder)1 LoadbalanceAlgorithm (org.apache.synapse.endpoints.algorithms.LoadbalanceAlgorithm)1 SimpleClientSessionDispatcher (org.apache.synapse.endpoints.dispatch.SimpleClientSessionDispatcher)1