Search in sources :

Example 6 with LoadbalanceAlgorithm

use of org.apache.synapse.endpoints.algorithms.LoadbalanceAlgorithm 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)

Example 7 with LoadbalanceAlgorithm

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

the class ServiceLoadBalanceMembershipHandler method getNextApplicationMember.

public Member getNextApplicationMember(String host) {
    DomainAlgorithmContext domainAlgorithmContext = getDomainAlgorithmContext(host);
    String lbDomain = domainAlgorithmContext.getDomain();
    LoadbalanceAlgorithm algorithm = domainAlgorithmContext.getAlgorithm();
    GroupManagementAgent groupMgtAgent = clusteringAgent.getGroupManagementAgent(lbDomain);
    if (groupMgtAgent == null) {
        String msg = "A LoadBalanceEventHandler has not been specified in the axis2.xml " + "file for the domain " + lbDomain + " for host " + host;
        log.error(msg);
        throw new SynapseException(msg);
    }
    algorithm.setApplicationMembers(groupMgtAgent.getMembers());
    AlgorithmContext context = domainAlgorithmContext.getAlgorithmContext();
    return algorithm.getNextApplicationMember(context);
}
Also used : AlgorithmContext(org.apache.synapse.endpoints.algorithms.AlgorithmContext) SynapseException(org.apache.synapse.SynapseException) GroupManagementAgent(org.apache.axis2.clustering.management.GroupManagementAgent) LoadbalanceAlgorithm(org.apache.synapse.endpoints.algorithms.LoadbalanceAlgorithm)

Aggregations

LoadbalanceAlgorithm (org.apache.synapse.endpoints.algorithms.LoadbalanceAlgorithm)7 QName (javax.xml.namespace.QName)5 OMAttribute (org.apache.axiom.om.OMAttribute)5 OMElement (org.apache.axiom.om.OMElement)4 SynapseException (org.apache.synapse.SynapseException)4 Dispatcher (org.apache.synapse.endpoints.dispatch.Dispatcher)3 HttpSessionDispatcher (org.apache.synapse.endpoints.dispatch.HttpSessionDispatcher)3 SoapSessionDispatcher (org.apache.synapse.endpoints.dispatch.SoapSessionDispatcher)3 Endpoint (org.apache.synapse.endpoints.Endpoint)2 URL (java.net.URL)1 ArrayList (java.util.ArrayList)1 Iterator (java.util.Iterator)1 List (java.util.List)1 Properties (java.util.Properties)1 StAXOMBuilder (org.apache.axiom.om.impl.builder.StAXOMBuilder)1 GroupManagementAgent (org.apache.axis2.clustering.management.GroupManagementAgent)1 LoadBalanceMembershipHandler (org.apache.synapse.core.LoadBalanceMembershipHandler)1 DynamicLoadbalanceEndpoint (org.apache.synapse.endpoints.DynamicLoadbalanceEndpoint)1 LoadbalanceEndpoint (org.apache.synapse.endpoints.LoadbalanceEndpoint)1 SALoadbalanceEndpoint (org.apache.synapse.endpoints.SALoadbalanceEndpoint)1