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 <
[email protected]> 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 <
> [email protected]> 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] <
>> [email protected]> 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.

Reply via email to