Hello,
Any update on this ?

If we want to contribute some docs patches, what is the way for it ? I
don't see docs in source code of project. I've read this
http://cxf.apache.org/getting-involved.html.


Thanks
Regards
Philippe

On Mon, May 6, 2013 at 6:53 PM, Philippe Mouawad <pmoua...@apache.org>wrote:

> Thanks Daniel,
> That fixes the concurrent access but In my understanding and tests it does
> not allow setting a different timeout depending on method, right ?
> Maybe I am not clear enought, here is the call sequence I have where I
> want a timeout of 3 secondes for getCustomersByName and default one for
> getCustomersById:
>
> CustomerService service = getService();
>         long t = System.currentTimeMillis();
>         System.out.println("Start time-->" + t);
>         try {
>             HTTPClientPolicy policy = new HTTPClientPolicy();
>             policy.setReceiveTimeout(3000);
>
> ((BindingProvider)service).getRequestContext().put("thread.local.request.context",
> "true");
>
> ((BindingProvider)service).getRequestContext().put(HTTPClientPolicy.class.getName(),
> policy);
> // Dirty code for demo
>             System.out.println(service.getCustomersByName("timeout"));
>         } catch (Exception e) {
> // Dirty code for demo
>             e.printStackTrace();
>         }
>         org.apache.cxf.endpoint.Client client =
> ClientProxy.getClient(service);
>         HTTPConduit conduit = (HTTPConduit) client.getConduit();
> // Dirty code for demo
>         System.out.println(conduit);
>
>         service = getService();
> //  THIS ONE IS IMPACTED BY PREVIOUS SETTING AS IT'S IN SAME THREAD
>         service.getCustomerById("timeout");
>
> Thanks
>
>
> On Mon, May 6, 2013 at 6:32 PM, Daniel Kulp <dk...@apache.org> wrote:
>
>>
>> On May 6, 2013, at 10:48 AM, Philippe Mouawad <pmoua...@apache.org>
>> wrote:
>>
>> > Hello Daniel
>> >
>> > Many thanks for clarifications but what I don't understand is how this
>> one
>> > would not impact other methods of Webservice.
>> > - ((BindingProvider)proxy)
>> > getRequestContext().put(HTTPClientPolicy.class.getName(), policy);
>> > I made a little test and it seems the second operation getCustomerById
>> is
>> > impacted, which seems to me regular as the service is a Spring Bean. Am
>> I
>> > missing something ?
>>
>> Oh.. forgot to mention you would have to flip the request context over to
>> be threadsafe/threadlocal first:
>>
>> From:
>> http://cxf.apache.org/faq.html#FAQ-AreJAXWSclientproxiesthreadsafe%3F
>>
>> ((BindingProvider)proxy).getRequestContext().put("thread.local.request.context",
>> "true");
>>
>> that would then start using a thread local for the context which would
>> keep the operations separate.
>>
>> Dan
>>
>>
>>
>>
>> >
>> > Regards
>> > Philippe
>> >
>> >>
>> >> On Mon, May 6, 2013 at 4:09 PM, Daniel Kulp <dk...@apache.org> wrote:
>> >>
>> >>>
>> >>> On May 6, 2013, at 10:06 AM, Philippe Mouawad <pmoua...@apache.org>
>> >>> wrote:
>> >>>
>> >>> Many Thanks Daniel for your clarification.
>> >>> And what about the described ways, are they OK to you ?
>> >>>
>> >>>
>> >>> 1&2 is correct.   It would work outside of spring, but would not be
>> >>> thread safe.   A pool of client would work though.
>> >>>
>> >> Great
>> >>
>> >>>
>> >>> 3:  I don't think the interceptor setting the Message.RECEIVE_TIMEOUT
>> >>> will work as I don't think that affects the HTTP level timeout, just
>> the
>> >>> timeout used for the async calls.  I could be wrong though.
>> >>>
>> >>> It works I tested it and debugged to be sure it does. It follows one
>> of
>> >> your explanations ;-) :
>> >>
>> >>   -
>> >>
>> http://cxf.547215.n5.nabble.com/Setting-Http-conduit-using-spring-configuration-file-td2644363.html
>> >>
>> >> I changed it to be this to only affect one operation:
>> >>
>> >>    @Override
>> >>    public void handleMessage(Message message) throws Fault {
>> >>        if("{
>> >> http://customerservice.example.com/}CustomerServiceServiceSoapBinding
>> >> ".equals(
>> >>
>> >>
>> message.getExchange().getBindingOperationInfo().getBinding().getName().toString())
>> >> &&
>> >>                "{
>> http://customerservice.example.com/}getCustomersByName
>> >>
>> ".equals(message.getExchange().getBindingOperationInfo().getOperationInfo().getName().toString())
>> >>                ) {
>> >>
>> >>            message.put(Message.RECEIVE_TIMEOUT,
>> >> getReceiveTimeout());
>> >>        }
>> >>    }
>> >>
>> >>
>> >>
>> >>> 4:  As you mention, it's an open bug.  Likely should work, but not
>> >>> implemented yet.
>> >>>
>> >>> Great
>> >>
>> >>>
>> >>> Dan
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>> Thanks
>> >>> Regards
>> >>> Philippe
>> >>>
>> >>> On Mon, May 6, 2013 at 3:57 PM, Daniel Kulp <dk...@apache.org> wrote:
>> >>>
>> >>>>
>> >>>> I think the only way to do it right now is to create a specific
>> >>>> HTTPClientPolicy object for your operation and do something like;
>> >>>>
>> >>>>
>> ((BindingProvider)proxy).getRequestContext().put(HTTPClientPolicy.class.getName(),
>> >>>> policy);
>> >>>>
>> >>>> The conduit should pick that up and intersect it with anything
>> >>>> configured at the conduit level and then use that.   That should at
>> least
>> >>>> work with 2.7.x.
>> >>>>
>> >>>>
>> >>>> Dan
>> >>>>
>> >>>>
>> >>>>
>> >>>>
>> >>>> On May 3, 2013, at 3:57 AM, Philippe Mouawad <pmoua...@apache.org>
>> >>>> wrote:
>> >>>>
>> >>>>> Hello,
>> >>>>>
>> >>>>> I am working on the right way to configure Client Timeout on client
>> >>>> side
>> >>>>> and I am kind of confused by what I read:
>> >>>>>
>> >>>>>  -
>> >>>>>
>> >>>>
>> http://cxf.547215.n5.nabble.com/Setting-Http-conduit-using-spring-configuration-file-td2644363.html
>> >>>>>  - https://issues.apache.org/jira/browse/CXF-3011
>> >>>>>  -
>> >>>>>
>> >>>>
>> http://stackoverflow.com/questions/3012787/connection-details-timeouts-in-a-java-web-service-client
>> >>>>>  -
>> >>>>>
>> >>>>
>> http://stackoverflow.com/questions/3130913/setting-jax-ws-client-timeout/6700210#6700210
>> >>>>>  -
>> >>>>>
>> >>>>
>> http://stackoverflow.com/questions/2148915/how-do-i-set-the-timeout-for-a-jax-ws-webservice-client/6700216#6700216
>> >>>>>
>> >>>>>
>> >>>>> So the things that work:
>> >>>>>
>> >>>>>
>> >>>>> 1) Outside of Spring, this one works fine:
>> >>>>>
>> >>>>> CustomerServiceService customerService = new
>> CustomerServiceService(new
>> >>>>> URL("http://localhost:8080/pyxis/services/customerService?wsdl";));
>> >>>>> CustomerService client = customerService.getCustomerServicePort();
>> >>>>> Client cl = ClientProxy.getClient(client);
>> >>>>> HTTPConduit http = (HTTPConduit) cl.getConduit();
>> >>>>> HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
>> >>>>> httpClientPolicy.setConnectionTimeout(5000);
>> >>>>> httpClientPolicy.setReceiveTimeout(1500);
>> >>>>> http.setClient(httpClientPolicy);
>> >>>>>
>> >>>>> client.myMethod()
>> >>>>>
>> >>>>>
>> >>>>> Question =>  This would be OK outside of Spring right ?
>> >>>>>
>> >>>>>
>> >>>>> 2) But within Spring, I understand it is not Thread Safe to modify
>> the
>> >>>>> conduit as the service would be a singleton ?
>> >>>>>
>> >>>>> Question  => Is it the reason for which it is not fine or did I
>> >>>>> misunderstand ?
>> >>>>>
>> >>>>>
>> >>>>> 3) So I coded this Interceptor:
>> >>>>>
>> >>>>> public class OutTimeoutInterceptor extends
>> >>>>> AbstractPhaseInterceptor<Message> {
>> >>>>>   private int receiveTimeout;
>> >>>>>   public OutTimeoutInterceptor() {
>> >>>>>       super(Phase.PREPARE_SEND);
>> >>>>>   }
>> >>>>>   public OutTimeoutInterceptor(String phase) {
>> >>>>>       super(phase);
>> >>>>>   }
>> >>>>>
>> >>>>>   public OutTimeoutInterceptor(String phase, boolean uniqueId) {
>> >>>>>       super(phase, uniqueId);
>> >>>>>
>> >>>>>   }
>> >>>>>
>> >>>>>   public OutTimeoutInterceptor(String i, String p, boolean
>> uniqueId) {
>> >>>>>       super(i, p, uniqueId);
>> >>>>>
>> >>>>>   }
>> >>>>>
>> >>>>>   public OutTimeoutInterceptor(String i, String p) {
>> >>>>>       super(i, p);
>> >>>>>
>> >>>>>   }
>> >>>>>
>> >>>>>   @Override
>> >>>>>   public void handleMessage(Message message) throws Fault {
>> >>>>>       if("{
>> >>>>>
>> http://customerservice.example.com/}CustomerServiceServiceSoapBinding
>> >>>>
>> ".equals(message.getExchange().getBindingOperationInfo().getBinding().getName().toString()))
>> >>>>> {
>> >>>>>           message.put(Message.RECEIVE_TIMEOUT,
>> >>>>> getReceiveTimeout());
>> >>>>>       }
>> >>>>>   }
>> >>>>>
>> >>>>>   /**
>> >>>>>    * @return the receiveTimeout
>> >>>>>    */
>> >>>>>   public int getReceiveTimeout() {
>> >>>>>       return receiveTimeout;
>> >>>>>   }
>> >>>>>
>> >>>>>   /**
>> >>>>>    * @param receiveTimeout the receiveTimeout to set
>> >>>>>    */
>> >>>>>   public void setReceiveTimeout(int receiveTimeout) {
>> >>>>>       this.receiveTimeout = receiveTimeout;
>> >>>>>   }
>> >>>>>
>> >>>>> }
>> >>>>>
>> >>>>>
>> >>>>> Configured this:
>> >>>>>
>> >>>>> <beans xmlns="http://www.springframework.org/schema/beans";
>> >>>>>   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>> xmlns:jaxws="
>> >>>>> http://cxf.apache.org/jaxws";
>> >>>>>   xmlns:jee="http://www.springframework.org/schema/jee";
>> >>>> xmlns:http-conf="
>> >>>>> http://cxf.apache.org/transports/http/configuration";
>> >>>>>   xsi:schemaLocation="http://www.springframework.org/schema/beans
>> >>>>> http://www.springframework.org/schema/beans/spring-beans.xsd
>> >>>>> http://cxf.apache.org/jaxws
>> >>>>> http://cxf.apache.org/schemas/jaxws.xsd
>> >>>>> http://cxf.apache.org/core
>> >>>>> http://cxf.apache.org/schemas/core.xsd
>> >>>>> http://cxf.apache.org/transports/http/configuration
>> >>>>> http://cxf.apache.org/schemas/configuration/http-conf.xsd";>
>> >>>>>
>> >>>>>   <!-- Needed -->
>> >>>>>   <!-- When you don't use the imports, when a Bus is needed, it will
>> >>>>> create a default
>> >>>>> bus which would be using it's own spring context.   When the Bus
>> looks
>> >>>> for
>> >>>>> configuration, it would just look in that spring context since it
>> >>>> wouldn't
>> >>>>> know about your context.  I THINK if you use a jaxws:client thing
>> >>>> instead
>> >>>>> of a
>> >>>>> spring bean, it MAY wire the current context into the default bus.
>>  Not
>> >>>>> really
>> >>>>> sure though.   However, if you use normal spring beans, not much we
>> >>>> can do
>> >>>>> unless we create spring specific subclasses (which we could) that
>> >>>> would be
>> >>>>> Spring ApplicationContextAware to to wire things.   Would be more
>> of a
>> >>>>> documentation issue of "when to use JaxWsProxyFactoryBean or
>> >>>>> SpringJaxWsProxyFactoryBean" and such.
>> >>>>>   -->
>> >>>>>   <import resource="classpath:META-INF/cxf/cxf.xml" />
>> >>>>>   <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"
>> />
>> >>>>>   <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
>> >>>>>   <http-conf:conduit
>> >>>>>       name="{
>> >>>>>
>> http://customerservice.example.com/}CustomerServicePort.http-conduit";>
>> >>>>>       <http-conf:client ReceiveTimeout="30000" />
>> >>>>>   </http-conf:conduit>
>> >>>>>
>> >>>>>   <bean id="proxyFactory"
>> >>>>> class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
>> >>>>>       <property name="serviceClass"
>> >>>>> value="com.example.customerservice.CustomerService" />
>> >>>>>       <property name="wsdlLocation"
>> >>>>> value="classpath:/wsdl/CustomerService.wsdl" />
>> >>>>>       <property name="address"
>> >>>>>           value="
>> http://localhost:8080/pyxis/services/customerService";
>> >>>> />
>> >>>>>       <property name="inInterceptors">
>> >>>>>           <list>
>> >>>>>               <ref bean="logIn" />
>> >>>>>           </list>
>> >>>>>       </property>
>> >>>>>       <property name="outInterceptors">
>> >>>>>           <list>
>> >>>>>               <ref bean="logOut" />
>> >>>>>
>> >>>>> <!-- Set timeout per operation-->
>> >>>>>               <ref bean="timeoutSetter" />
>> >>>>>           </list>
>> >>>>>       </property>
>> >>>>>   </bean>
>> >>>>>   <bean id="client"
>> class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"
>> >>>>>       factory-bean="proxyFactory" factory-method="create" />
>> >>>>>   <bean id="logIn"
>> >>>>> class="org.apache.cxf.interceptor.LoggingInInterceptor" />
>> >>>>>   <bean id="logOut"
>> >>>>> class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
>> >>>>>   <bean id="timeoutSetter"
>> >>>>> class="com.adeo.pyxis.poc.cxf.client.OutTimeoutInterceptor">
>> >>>>>      <property name="receiveTimeout" value="3000" />
>> >>>>>   </bean>
>> >>>>>   <bean id="factory"
>> >>>> class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean" />
>> >>>>> </beans>
>> >>>>>
>> >>>>>
>> >>>>> Question => This works fine but seems to me not that straight, so I
>> >>>> wonder
>> >>>>> if it's the right way ?
>> >>>>>
>> >>>>>
>> >>>>> 4) I thought the JAXWS way would work reading this:
>> >>>>>
>> >>>>> http://cxf.apache.org/docs/developing-a-consumer.html
>> >>>>>
>> >>>>> *Request context* - on the client side, the request context enables
>> >>>> you to
>> >>>>> set properties that affect outbound messages. Request context
>> >>>> properties
>> >>>>> are applied to a specific port instance and, once set, the
>> properties
>> >>>>> affect every subsequent operation invocation made on the port, until
>> >>>> such
>> >>>>> time as a property is explicitly cleared. For example, you might
>> use a
>> >>>>> request context property to set a connection timeout or to
>> initialize
>> >>>> data
>> >>>>> for sending in a header.
>> >>>>>
>> >>>>>   Service = new Service();
>> >>>>>
>> >>>>>   Port = Service.getPort();
>> >>>>>
>> >>>>>
>> >>>>>   ((BindingProvider) Port).getRequestContext().put(
>> >>>>>           BindingProviderProperties.CONNECT_TIMEOUT,
>> >>>>>           30);
>> >>>>>   ((BindingProvider) Port).getRequestContext().put(
>> >>>>>           BindingProviderProperties.REQUEST_TIMEOUT,
>> >>>>>           30);
>> >>>>>
>> >>>>> But it does not and I am confused by this Open bug:
>> >>>>>
>> >>>>> https://issues.apache.org/jira/browse/CXF-3011
>> >>>>>
>> >>>>>
>> >>>>> Question => Is it supposed to work ? Looking into source code I
>> don't
>> >>>> find
>> >>>>> how but I would like some confirmation ?
>> >>>>>
>> >>>>>
>> >>>>> I will be happy to contribute documentation patch to clarify this
>> as it
>> >>>>> seems to me kind of difficult to find the right answer.
>> >>>>>
>> >>>>>
>> >>>>> Many thanks for your help and thanks for CXF !
>> >>>>>
>> >>>>> Regards
>> >>>>>
>> >>>>> Philippe
>> >>>>
>> >>>> --
>> >>>> Daniel Kulp
>> >>>> dk...@apache.org - http://dankulp.com/blog
>> >>>> Talend Community Coder - http://coders.talend.com
>> >>>>
>> >>>>
>> >>>
>> >>> --
>> >>> Daniel Kulp
>> >>> dk...@apache.org - http://dankulp.com/blog
>> >>> Talend Community Coder - http://coders.talend.com
>> >>>
>> >>>
>> >>
>>
>> --
>> Daniel Kulp
>> dk...@apache.org - http://dankulp.com/blog
>> Talend Community Coder - http://coders.talend.com
>>
>>
>

Reply via email to