You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/05/18 14:24:19 UTC

[james-project] 07/07: [PERFORMANCE] Limit object creation upon JMAP Draft request writing

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 1542cba72f53722798b110296de2da365357844c
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue May 18 12:44:49 2021 +0700

    [PERFORMANCE] Limit object creation upon JMAP Draft request writing
    
    Filters are dependent of client request, requiring ObjectMapper reconfiguration
    as object mapper configuration changes are not thread safe.
    
    However ObjectMapper javadoc states the following:
    
    ```
    Method is typically
    used when multiple, differently configured mappers are needed.
    Although configuration is shared, cached serializers and deserializers
    are NOT shared, which means that the new instance may be re-configured
    before use; meaning that it behaves the same way as if an instance
    was constructed from scratch.
    ```
    
    This sounds like our use case!
    
    This conforts to advices of this page: https://github.com/FasterXML/jackson-docs/wiki/Presentation:-Jackson-Performance
    
    ```
    Reuse heavy-weight objects: ObjectMapper (data-binding) and JsonFactory (streaming API)
    ```
---
 .../james/jmap/draft/methods/JmapResponseWriterImpl.java       | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/JmapResponseWriterImpl.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/JmapResponseWriterImpl.java
index a0e1dd8..d2a346b 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/JmapResponseWriterImpl.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/JmapResponseWriterImpl.java
@@ -40,11 +40,11 @@ import reactor.core.publisher.Flux;
 public class JmapResponseWriterImpl implements JmapResponseWriter {
 
     public static final String PROPERTIES_FILTER = "propertiesFilter";
-    private final ObjectMapperFactory objectMapperFactory;
+    private final ObjectMapper objectMapper;
 
     @Inject
     public JmapResponseWriterImpl(ObjectMapperFactory objectMapperFactory) {
-        this.objectMapperFactory = objectMapperFactory;
+        this.objectMapper = objectMapperFactory.forWriting();
     }
 
     @Override
@@ -60,17 +60,13 @@ public class JmapResponseWriterImpl implements JmapResponseWriter {
     }
     
     private ObjectMapper newConfiguredObjectMapper(JmapResponse jmapResponse) {
-        ObjectMapper objectMapper = objectMapperFactory.forWriting();
-        
         FilterProvider filterProvider = jmapResponse
                 .getFilterProvider()
                 .orElseGet(SimpleFilterProvider::new)
                 .setDefaultFilter(SimpleBeanPropertyFilter.serializeAll())
                 .addFilter(PROPERTIES_FILTER, getPropertiesFilter(jmapResponse.getProperties()));
         
-        objectMapper.setFilterProvider(filterProvider);
-
-        return objectMapper;
+        return objectMapper.copy().setFilterProvider(filterProvider);
     }
     
     private PropertyFilter getPropertiesFilter(Optional<? extends Set<? extends Property>> properties) {

---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org