[ 
https://issues.apache.org/jira/browse/CXF-5745?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14001472#comment-14001472
 ] 

Xilai Dai commented on CXF-5745:
--------------------------------

That's the default behaviour of FailoverTargetSelector (not sure it's a bug or 
by design), but you may do some extension to match your requirement.

1) provide a MySequentialStrategy which extends SequentialStrategy
{code}
public class MySequentialStrategy extends SequentialStrategy {
    ......
    public String getPrimaryAddress(Exchange exchange) {
        ......
        return primaryUrl;
    }
    ......
}
{code}
2) provide a MyTargetSelector which extends FailoverTargetSelector
{code}
import org.apache.cxf.clustering.FailoverTargetSelector;
......
public class MyTargetSelector extends FailoverTargetSelector {

    @Override
    public synchronized void prepare(Message message) {
        setAddress(message);
        super.prepare(message);
    }

    private void setAddress(Message message) {
        String primaryUrl = strategy.getPrimaryAddress(message.getExchange());

        if (primaryUrl != null) {
            endpoint.getEndpointInfo().setAddress(primaryUrl);
            message.put(Message.ENDPOINT_ADDRESS, primaryUrl);
        }
    }
}
{code}
3) provide a MyFailoverFeature:
{code}
public class MyFailoverFeature extends AbstractFeature {
    ......
    @Override
    public void initialize(InterceptorProvider interceptorProvider, Bus bus) {
        if (interceptorProvider instanceof ConduitSelectorHolder) {
            ConduitSelectorHolder conduitSelectorHolder = 
(ConduitSelectorHolder)interceptorProvider;

            MyTargetSelector selector = new MyTargetSelector();
            
selector.setEndpoint(conduitSelectorHolder.getConduitSelector().getEndpoint());
            selector.setStrategy(mySequentialStrategy);

            conduitSelectorHolder.setConduitSelector(selector);

        }
    }
    ......
}
{code}

then, add this MyFailoverFeature into your JaxWsProxyFactoryBean.

> CXF Failover feature does not return to primary URL. It returns to first in 
> failover urls.
> ------------------------------------------------------------------------------------------
>
>                 Key: CXF-5745
>                 URL: https://issues.apache.org/jira/browse/CXF-5745
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-WS Runtime
>    Affects Versions: 2.7.5
>            Reporter: Jan Zanda
>            Priority: Minor
>
> I have a WS consumer, which uses one primary URL and up to 8 failover urls. 
> The consumer is created this way (see also comments in code):
> {noformat}
> JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
> factory.setServiceClass(SomeClientClass.class);
> factory.setAddress(primaryUrl); // this is http://primaryhost/service
> factory.setFeatures(getFailoverFeatures());
> List<AbstractFeature> getFailoverFeatures() {
>   FailoverFeature feature = new FailoverFeature();
>   SequentialStrategy strategy = new SequentialStrategy(); 
>   strategy.setAlternateAddresses(failoverUrls); //failoverUrls is a List of 
> urls.
>   // something like {'http://failoverOne/service', 
> 'http://failoverTwo/service'}
>   feature.setStrategy(strategy);
>   List<AbstractFeature> features = new ArrayList<AbstractFeature>();
>   features.add(feature);
>   return features;
> }
> {noformat}
> However, when application run out of failover URLs, it will write to log this:
> {noformat}
> 2014-05-16 09:00:03,473 WARN  [AbstractStaticFailoverStrategy] no alternate 
> targets remain => giving up on failover
> 2014-05-16 09:00:03,473 INFO  [FailoverTargetSelector] reverted to original 
> address http://failoverOne/service
> {noformat}
> Is there a way how to tell the failover feature to rotate ALL of the urls, 
> primary URL included?
> Thanks. 



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to