cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: Closing of WebClient and Response objects
Date Wed, 16 Aug 2017 22:37:01 GMT
Yes, I see "response.stream.auto.close" does not work if you do 
something like

webCliemt.get(Book.class)

but does work if you do

webCliemt.get().readEntity(Book.class)

I recall now I might've implemented this property while working on 
JAX-RS 2.0 impl of Response which talks about this auto-closing in its 
docs, while the usage of this property in a case where response is read 
implicitly was not taken care of

So if you'd do to continue doing the auto-closing just follow

webCliemt.get().readEntity(Book.class) pattern

in meantime I'll have a look at this property working in a

webCliemt.get(Book.class)

Sergey

On 16/08/17 23:04, sbalustar wrote:
> Sergey ,
> 
> In CXF 2.7.7, in readBody method, there is no call for readEntity, thats
> why it is not throwing any exception . But in 3.1.8 , first readEntity
> method is called and later getEntity method is called.   Seems like it is
> Bug in AbstractClient.java in 3.1.8 version. What do you say?
> 
> On Wed, Aug 16, 2017 at 2:51 PM, Balakrishna Sudabathula <
> bsudabathula@gmail.com> wrote:
> 
>> readBody method code ()
>>
>>      protected <T> T readBody(Response r, Message outMessage, Class<T>
cls,
>>
>>
>>                               Type type, Annotation[] anns) {
>>
>>
>>
>>          if (cls == Response.class) {
>>
>>              return cls.cast(r);
>>
>>          }
>>
>>
>>
>>          int status = r.getStatus();
>>
>>          if ((status < 200 || status == 204) && r.getLength() <= 0
||
>> status >= 300) {
>>
>>              return null;
>>
>>          }
>>
>>          return ((ResponseImpl)r).doReadEntity(cls, type, anns);
>>
>>
>>      }
>>
>> On Wed, Aug 16, 2017 at 2:48 PM, Balakrishna Sudabathula <
>> bsudabathula@gmail.com> wrote:
>>
>>> Please find the attachement. In WebClient handle handleResponse () method
>>> there is method call readBody (), in that method readEntity method is
>>> called. After that there is another method call  JAXRSUtils.fromRespons
>>> which is calling getEntity method
>>>
>>>
>>>
>>> On Wed, Aug 16, 2017 at 2:29 PM, Sergey Beryozkin [via CXF] <
>>> ml+s547215n5782761h25@n5.nabble.com> wrote:
>>>
>>>> So where is readEntity is called from ?
>>>> On 16/08/17 22:26, sbalustar wrote:
>>>>
>>>>> In CXF 3.1.8
>>>>>
>>>>> There is a call in readEntity menthod autoClose(), but in cxf 2.7.7
>>>>   there
>>>>> is no such method call.
>>>>>
>>>>>      protected void autoClose(Class<?> cls, boolean exception)
{
>>>>>
>>>>>           if (!entityBufferred && cls != InputStream.class
>>>>>
>>>>>               && (exception || MessageUtils.isTrue(outMessage
>>>>> .getContextualProperty("response.stream.auto.close")))) {
>>>>>
>>>>>               close();
>>>>>
>>>>>           }
>>>>>
>>>>>       }
>>>>>
>>>>>
>>>>> If the auto close is set to true , then it is calling close method ,
>>>> and
>>>>> changing the entityClosed value to true.
>>>>>
>>>>>
>>>>>
>>>>> On Wed, Aug 16, 2017 at 2:18 PM, Balakrishna Sudabathula <
>>>>> [hidden email] <http:///user/SendEmail.jtp?type=node&node=5782761&i=0>>
>>>> wrote:
>>>>>
>>>>>> Why because IN CXF 3.1.8 , The Code in the ResponseImpl class is
like
>>>> below
>>>>>>
>>>>>>
>>>>>>       public Object getEntity() {
>>>>>>           return InjectionUtils.getEntity(getActualEntity());
>>>>>>       }
>>>>>>
>>>>>>
>>>>>>     public Object getActualEntity() {
>>>>>>           checkEntityIsClosed();
>>>>>>           return lastEntity != null ? lastEntity : entity;
>>>>>>       }
>>>>>>
>>>>>>     private void checkEntityIsClosed() {
>>>>>>
>>>>>>           if (entityClosed) {
>>>>>>
>>>>>>               throw new IllegalStateException("Entity is not
>>>> available");
>>>>>>
>>>>>>           }
>>>>>>
>>>>>>       }
>>>>>>
>>>>>>
>>>>>>    public void close() throws ProcessingException {
>>>>>>
>>>>>>           if (!entityClosed) {
>>>>>>
>>>>>>               if (!entityBufferred && entity instanceof InputStream)
{
>>>>>>
>>>>>>                   try {
>>>>>>
>>>>>>                       ((InputStream)entity).close();
>>>>>>
>>>>>>                   } catch (IOException ex) {
>>>>>>
>>>>>>                       throw new ResponseProcessingException(this,
>>>> ex);
>>>>>>
>>>>>>                   }
>>>>>>
>>>>>>               }
>>>>>>
>>>>>>               entity = null;
>>>>>>
>>>>>>               entityClosed = true;
>>>>>>
>>>>>>           }
>>>>>>
>>>>>>
>>>>>>
>>>>>>       }
>>>>>> In the readEntity method, there is a call to close() method which
the
>>>>>> entityClosed variable value is set to true. When calling the
>>>> getEntity()
>>>>>> method , there is a another method call checkEntityIsClosed is
>>>> throwing the
>>>>>> exception because the entityClosed is set to true in readEntity.
>>>>>>
>>>>>>
>>>>>> But In CXF 2.7.7,  there is no method call in the getEntity() method
>>>> ,
>>>>>> simply it returns the entity
>>>>>>
>>>>>> public Object getEntity() {
>>>>>>           return lastEntity != null ? lastEntity : entity;
>>>>>>       }
>>>>>>
>>>>>>
>>>>>> On Wed, Aug 16, 2017 at 1:58 PM, Sergey Beryozkin [via CXF] <
>>>>>> [hidden email]
>>>> <http:///user/SendEmail.jtp?type=node&node=5782761&i=1>>
wrote:
>>>>>>
>>>>>>> Hi, that will need to be measured for a concrete flow.
>>>>>>> I'm still not sure why you are seeing the failure with the auto
>>>> close
>>>>>>> being on - it only takes effect after the entity has been
>>>> consumed...
>>>>>>>
>>>>>>> Sergey
>>>>>>> On 16/08/17 19:03, sbalustar wrote:
>>>>>>>
>>>>>>>> Hi Sergey,
>>>>>>>>
>>>>>>>>       At runtime,  in Debug mode Changed the
>>>>>>> response.stream.auto.close=false.
>>>>>>>> Later on , i am not facing the Entity Not available Exception.
>>>>>>>>
>>>>>>>>      Is there any impact on the performance when we disabled
the
>>>> flag?
>>>>>>>>
>>>>>>>> On Wed, Aug 16, 2017 at 3:32 AM, Sergey Beryozkin [via CXF]
<
>>>>>>>> [hidden email] <http:///user/SendEmail.jtp?ty
>>>> pe=node&node=5782757&i=0>>
>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi
>>>>>>>>>
>>>>>>>>> I don't quite understand what the issue is, does it happen
when
>>>> you
>>>>>>>>> enable "response.stream.auto.close" ? If yes - what happens
if you
>>>> do
>>>>>>>>> not enable this property ?
>>>>>>>>>
>>>>>>>>> CXF does not auto-close the input stream by default given
of the
>>>> few
>>>>>>>>> well-known side-effects.
>>>>>>>>>
>>>>>>>>> Given you have already tried to debug - it is better
to set a
>>>>>>> breakpoint
>>>>>>>>> inside org.apache.cxf.jaxrs.impl.ResponseImpl - there
you will
>>>> see
>>>>>>> why
>>>>>>>>> InputStream is not available in your case
>>>>>>>>>
>>>>>>>>> Cheers, Sergey
>>>>>>>>>
>>>>>>>>> On 15/08/17 23:20, sbalustar wrote:
>>>>>>>>>
>>>>>>>>>> HI sergey, We are upgrading CXF version 2.7.7 to
3.1.8 and facing
>>>> the
>>>>>>>>> below
>>>>>>>>>> issue.
>>>>>>>>>>
>>>>>>>>>> AUDIT:2017-08-15 11:31:11.047:localhost-startStop-1:"Caused
by
>>>>>>>>>> javax.ws.rs.ProcessingException: java.lang.IllegalStateException:
>>>>
>>>>>>>>> Entity is
>>>>>>>>>> not available
>>>>>>>>>>         at
>>>>>>>>>> org.apache.cxf.jaxrs.client.WebClient.handleResponse(WebClient.java:1141)
>>>>
>>>>>>>
>>>>>>>>>
>>>>>>>>>>         at org.apache.cxf.jaxrs.client.We
>>>> bClient.doResponse(WebClient.java:1110)
>>>>>>>
>>>>>>>>>
>>>>>>>>>>         at
>>>>>>>>>> org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1035)
>>>>
>>>>>>>
>>>>>>>>>
>>>>>>>>>>         at org.apache.cxf.jaxrs.client.We
>>>> bClient.doInvoke(WebClient.java:892)
>>>>>>>
>>>>>>>>>
>>>>>>>>>>         at org.apache.cxf.jaxrs.client.We
>>>> bClient.doInvoke(WebClient.java:863)
>>>>>>>
>>>>>>>>>
>>>>>>>>>>         at org.apache.cxf.jaxrs.client.We
>>>> bClient.invoke(WebClient.java:413)
>>>>>>>
>>>>>>>>>
>>>>>>>>>>         at
>>>>>>>>>> com.walmart.platform.soa.client.RestClient.invoke(RestClient.java:261)
>>>>
>>>>>>>
>>>>>>>>>>      ... 78 more
>>>>>>>>>>
>>>>>>>>>> I have gone through this ticket
>>>>>>>>>> https://issues.apache.org/jira/browse/CXF-5144 which
you
>>>> mentioned
>>>>>>> that
>>>>>>>>> Set
>>>>>>>>>> this property: "response.stream.auto.close" to true.
This is done
>>>>>>> even
>>>>>>>>>> though we are getting the same issue.
>>>>>>>>>>
>>>>>>>>>> When i debug the code, in WebClient.invoke method
this exception
>>>> is
>>>>>>>>> occured.
>>>>>>>>>>
>>>>>>>>>>       protected Response handleResponse(Message outMessage,
>>>> Class<?>
>>>>>>>>>> responseClass, Type genericType) {
>>>>>>>>>>             try {
>>>>>>>>>>                 ResponseBuilder rb =
>>>> setResponseBuilder(outMessage,
>>>>>>>>>> outMessage.getExchange());
>>>>>>>>>>                 Response currentResponse = rb.clone().build();
>>>>>>>>>>                 ((ResponseImpl)currentResponse).setOutMessage(outMessage);
>>>>
>>>>>>>
>>>>>>>>>>
>>>>>>>>>>                 Object entity = readBody(currentResponse,
>>>> outMessage,
>>>>>>>>>> responseClass, genericType,
>>>>>>>>>>                                          new Annotation[]{});
>>>>>>>>>>
>>>>>>>>>>                 if (entity == null) {
>>>>>>>>>>                     int status = currentResponse.getStatus();
>>>>>>>>>>                     if (status >= 400) {
>>>>>>>>>>                         entity = currentResponse.getEntity();
>>>>>>>>>>                     }
>>>>>>>>>>                 }
>>>>>>>>>>                 rb = JAXRSUtils.fromResponse(currentResponse);
>>>>>>>>>>
>>>>>>>>>>                 rb.entity(entity instanceof Response
>>>>>>>>>>                           ? ((Response)entity).getEntity()
:
>>>> entity);
>>>>>>>>>>
>>>>>>>>>>                 Response r = rb.build();
>>>>>>>>>>                 getState().setResponse(r);
>>>>>>>>>>                 ((ResponseImpl)r).setOutMessage(outMessage);
>>>>>>>>>>                 return r;
>>>>>>>>>>             } catch (Throwable ex) {
>>>>>>>>>>                 throw (ex instanceof ProcessingException)
?
>>>>>>>>>> (ProcessingException)ex
>>>>>>>>>>                                                 
     : new
>>>>>>>>>> ProcessingException(ex);
>>>>>>>>>>             } finally {
>>>>>>>>>>
>>>>>>>>>> ClientProviderFactory.getInstance(outMessage).clearThreadLocalProxies();
>>>>
>>>>>>>
>>>>>>>>>
>>>>>>>>>>             }
>>>>>>>>>>         }
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>       public static ResponseBuilder fromResponse(Response
>>>> response) {
>>>>>>>>>>             ResponseBuilder rb = toResponseBuilder(response.getStatus());
>>>>
>>>>>>>
>>>>>>>>>> *        rb.entity(response.getEntity());
>>>>>>>>>> *        for (Map.Entry<String, List&lt;Object>>
entry :
>>>>>>>>>> response.getMetadata().entrySet()) {
>>>>>>>>>>                 List values = entry.getValue();
>>>>>>>>>>                 for (Object value : values) {
>>>>>>>>>>                     rb.header(entry.getKey(), value);
>>>>>>>>>>                 }
>>>>>>>>>>             }
>>>>>>>>>>             return rb;
>>>>>>>>>>         }
>>>>>>>>>>
>>>>>>>>>> * rb.entity(response.getEntity());
>>>>>>>>>> * seems like , entity is null in ResponseBuilder
rb from the
>>>>>>>>> fromResponse
>>>>>>>>>> method.
>>>>>>>>>>
>>>>>>>>>> Please let me know, what could be the solution to
fix this issue?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> View this message in context: http://cxf.547215.n5.nabble.
>>>>>>>>> com/Closing-of-WebClient-and-Response-objects-tp5748134p5782716.html
>>>>
>>>>>>>>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Sergey Beryozkin
>>>>>>>>>
>>>>>>>>> Talend Community Coders
>>>>>>>>> http://coders.talend.com/
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ------------------------------
>>>>>>>>> If you reply to this email, your message will be added
to the
>>>>>>> discussion
>>>>>>>>> below:
>>>>>>>>> http://cxf.547215.n5.nabble.com/Closing-of-WebClient-and-Res
>>>>>>> ponse-objects-
>>>>>>>>> tp5748134p5782725.html
>>>>>>>>> To unsubscribe from Closing of WebClient and Response
objects,
>>>> click
>>>>>>> here
>>>>>>>>> <
>>>>>>>>> .
>>>>>>>>> NAML
>>>>>>>>> <http://cxf.547215.n5.nabble.com/template/NamlServlet.jtp?ma
>>>>>>> cro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=
>>>>>>> nabble.naml.namespaces.BasicNamespace-nabble.view.web.
>>>>>>> template.NabbleNamespace-nabble.view.web.template.NodeNamesp
>>>>>>> ace&breadcrumbs=notify_subscribers%21nabble%3Aemail.
>>>>>>> naml-instant_emails%21nabble%3Aemail.naml-send_instant_
>>>>>>> email%21nabble%3Aemail.naml>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> View this message in context: http://cxf.547215.n5.nabble.co
>>>>>>> m/Closing-of-WebClient-and-Response-objects-tp5748134p5782748.html
>>>>>>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> ------------------------------
>>>>>>> If you reply to this email, your message will be added to the
>>>> discussion
>>>>>>> below:
>>>>>>> http://cxf.547215.n5.nabble.com/Closing-of-WebClient-and-Res
>>>>>>> ponse-objects-tp5748134p5782757.html
>>>>>>> To unsubscribe from Closing of WebClient and Response objects,
click
>>>> here
>>>>>>> <
>>>>>>> .
>>>>>>> NAML
>>>>>>> <http://cxf.547215.n5.nabble.com/template/NamlServlet.jtp?ma
>>>> cro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=
>>>> nabble.naml.namespaces.BasicNamespace-nabble.view.web.templa
>>>> te.NabbleNamespace-nabble.view.web.template.NodeNamespac
>>>> e&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-
>>>> instant_emails%21nabble%3Aemail.naml-send_instant_email%
>>>> 21nabble%3Aemail.naml>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> View this message in context: http://cxf.547215.n5.nabble.co
>>>> m/Closing-of-WebClient-and-Response-objects-tp5748134p5782759.html
>>>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>>>>
>>>>
>>>>
>>>> --
>>>> Sergey Beryozkin
>>>>
>>>> Talend Community Coders
>>>> http://coders.talend.com/
>>>>
>>>>
>>>> ------------------------------
>>>> If you reply to this email, your message will be added to the discussion
>>>> below:
>>>> http://cxf.547215.n5.nabble.com/Closing-of-WebClient-and-Res
>>>> ponse-objects-tp5748134p5782761.html
>>>> To unsubscribe from Closing of WebClient and Response objects, click
>>>> here
>>>> <http://cxf.547215.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=5748134&code=YnN1ZGFiYXRodWxhQGdtYWlsLmNvbXw1NzQ4MTM0fDEyODI4MTYwNTM=>
>>>> .
>>>> NAML
>>>> <http://cxf.547215.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>>>>
>>>
>>>
>>
> 
> 
> 
> 
> --
> View this message in context: http://cxf.547215.n5.nabble.com/Closing-of-WebClient-and-Response-objects-tp5748134p5782764.html
> Sent from the cxf-user mailing list archive at Nabble.com.
> 


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Mime
View raw message