Hi,

I figured out the problem; the cache needs to be store values by
reference instead of by value:

MutableConfiguration<Key, Entry> ccfg =
new MutableConfiguration<Key, Entry>().setStoreByValue(false) ...


and I created a pull request to add caching features:
https://github.com/apache/cxf/pull/475


Nicola

On Tue, 2018-11-13 at 14:08 +0000, Nicola Buso wrote:
> Hi,
> 
> I can modify org.apache.cxf.jaxrs.client.cache.Entry to be
> serializable
> and at that point the cache is used.
> 
> I would also implement optional part of the cache protocol as "If-
> None-
> Match". At now the framework seem not able to handle a 304 reply from
> the server because it does not give the interceptor a chance to
> retrieve the message from the cache.
> 
> I modified
> org.apache.cxf.jaxrs.client.cache.CacheControlClientRequestFilter.fil
> te
> r with:
>     public void filter(final ClientRequestContext request) throws
> IOException {
>         if (!HttpMethod.GET.equals(request.getMethod())) {
>             //TODO: Review the possibility of supporting POST
> responses, example,
>             //      POST create request may get a created entity
> representation returned
>             request.setProperty(NO_CACHE_PROPERTY, "true");
>             return;
>         }
>         final URI uri = request.getUri();
>         final String accepts =
> request.getHeaderString(HttpHeaders.ACCEPT);
>         final Key key = new Key(uri, accepts);
>         Entry entry = cache.get(key);
>         if (entry != null) {
>             //TODO: do the extra validation against the conditional
> headers
>             //      which may be contained in the current request
>             if (entry.isOutDated()) {
>                 String ifNoneMatchHeader =
> entry.getCacheHeaders().get(HttpHeaders.IF_NONE_MATCH);
>                 if (StringUtils.isEmpty(ifNoneMatchHeader)) {
>                     cache.remove(key, entry);
>                 } else {
>                     request.getHeaders().add(HttpHeaders.IF_NONE_MATC
> H,
> ifNoneMatchHeader);
>                 }
>             } else {
>                 Object cachedEntity = entry.getData();
>                 Response.ResponseBuilder ok =
> Response.ok(cachedEntity);
>                 if (entry.getHeaders() != null) {
>                     for (Map.Entry<String, List<String>> h :
> entry.getHeaders().entrySet()) {
>                         for (final Object instance : h.getValue()) {
>                             ok = ok.header(h.getKey(), instance);
>                         }
>                     }
>                 }
>                 request.setProperty(CACHED_ENTITY_PROPERTY,
> cachedEntity);
>                 request.abortWith(ok.build());
>             }
>         }
>         // Should the map of all request headers shared ?
>         request.setProperty(CLIENT_ACCEPTS, accepts);
>         request.setProperty(CLIENT_CACHE_CONTROL,
> request.getHeaderString(HttpHeaders.CACHE_CONTROL));
>     }
> 
> 
> This will trigger a 304 response from the server, but we now need to
> recover the response from the cache.
> 
> Any idea where you would do it? at now the interceptor is not called
> for this case.
> 
> 
> Nicola
> 
> 
> On Mon, 2018-11-12 at 14:22 +0000, Nicola Buso wrote:
> > Hi everyone,
> > 
> > I'm interested to add HTTP Cache feature to a cxf client. I
> > configured
> > it and tried the ehcache jsr107 implementation and the reference
> > implementation and both are complaining about the class:
> > org.apache.cxf.jaxrs.impl.MetadataMap
> > 
> > that is not implementing Serializable.
> > Caused by: java.io.NotSerializableException:
> > org.apache.cxf.jaxrs.impl.MetadataMap
> >     at
> > java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:118
> > 4)
> >     at
> > java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.ja
> > va
> > :1
> > 548)
> >     at
> > java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:
> > 15
> > 09
> > )
> >     at
> > java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.j
> > av
> > a:
> > 1432)
> >     at
> > java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:117
> > 8)
> >     at
> > java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
> >     at
> > org.jsr107.ri.RISerializingInternalConverter$Serialized.<init>(RISe
> > ri
> > al
> > izingInternalConverter.java:123)
> > 
> > 
> > Is there some configuration I can do to avoid this error?
> > 
> > These are some of the involved libraries:
> >     <dependency>
> >         <groupId>org.apache.cxf</groupId>
> >         <artifactId>cxf-rt-rs-client</artifactId>
> >         <version>3.2.7</version>
> >     </dependency>
> >     <dependency>
> >         <groupId>javax.cache</groupId>
> >         <artifactId>cache-api</artifactId>
> >         <version>1.1.0</version>
> >     </dependency>
> >     <!--
> >     <dependency>
> >         <groupId>org.ehcache.modules</groupId>
> >         <artifactId>ehcache-107</artifactId>
> >         <version>3.6.1</version>
> >     </dependency>
> >     -->
> >     <dependency>
> >       <groupId>org.jsr107.ri</groupId>
> >       <artifactId>cache-ri-impl</artifactId>
> >       <version>1.1.0</version>
> >     </dependency>
> > 
> > 
> > Please let me know,
> > 
> > 
> > Nicola
> > 
> > 
-- 
Nicola Buso
Software Engineer - Web Production Team

European Bioinformatics Institute (EMBL-EBI)
European Molecular Biology Laboratory

Wellcome Trust Genome Campus
Hinxton
Cambridge CB10 1SD
United Kingdom

URL: http://www.ebi.ac.uk



Reply via email to