You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by mm...@apache.org on 2018/02/21 01:48:06 UTC

[incubator-pulsar] branch master updated: Add JsonIgnore to a few fields in configuration objects (#1260)

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

mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 8d9f277  Add JsonIgnore to a few fields in configuration objects (#1260)
8d9f277 is described below

commit 8d9f277cd4e3cb045ad971eb8fbe363d62d347b2
Author: Sijie Guo <gu...@gmail.com>
AuthorDate: Tue Feb 20 17:48:02 2018 -0800

    Add JsonIgnore to a few fields in configuration objects (#1260)
    
    *Problem*
    
    We have seen NPE thrown when `ConsumerStats` tries to dump the configuration object with a customized ConsumerEventsListener.
    The problem came from initialization sequence and when jackson tried to serialize the customized ConsumerEventsListener,
    it fails with NPE.
    
    In general, those customized implementation such as `MessageRouter`, `MessageListener` and `ConsumerEventsListener` are not
    really needed to serialize as part of json.
    
    *Solution*
    
    Add @JsonIgnore to those fields to bypass json serialization
---
 .../pulsar/client/api/ClientConfiguration.java     |  2 +
 .../pulsar/client/api/ConsumerConfiguration.java   |  4 ++
 .../pulsar/client/api/ProducerConfiguration.java   |  4 ++
 .../client/api/ConsumerConfigurationTest.java      | 68 ++++++++++++++++++++++
 4 files changed, 78 insertions(+)

diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/api/ClientConfiguration.java b/pulsar-client/src/main/java/org/apache/pulsar/client/api/ClientConfiguration.java
index 14f94da..7862c14 100644
--- a/pulsar-client/src/main/java/org/apache/pulsar/client/api/ClientConfiguration.java
+++ b/pulsar-client/src/main/java/org/apache/pulsar/client/api/ClientConfiguration.java
@@ -20,6 +20,7 @@ package org.apache.pulsar.client.api;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.io.Serializable;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -37,6 +38,7 @@ public class ClientConfiguration implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    @JsonIgnore
     private Authentication authentication = new AuthenticationDisabled();
     private long operationTimeoutMs = 30000;
     private long statsIntervalSeconds = 60;
diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/api/ConsumerConfiguration.java b/pulsar-client/src/main/java/org/apache/pulsar/client/api/ConsumerConfiguration.java
index 5f25fa8..bd6236a 100644
--- a/pulsar-client/src/main/java/org/apache/pulsar/client/api/ConsumerConfiguration.java
+++ b/pulsar-client/src/main/java/org/apache/pulsar/client/api/ConsumerConfiguration.java
@@ -21,6 +21,7 @@ package org.apache.pulsar.client.api;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
@@ -45,8 +46,10 @@ public class ConsumerConfiguration implements Serializable {
 
     private SubscriptionType subscriptionType = SubscriptionType.Exclusive;
 
+    @JsonIgnore
     private MessageListener messageListener;
 
+    @JsonIgnore
     private ConsumerEventListener consumerEventListener;
 
     private int receiverQueueSize = 1000;
@@ -59,6 +62,7 @@ public class ConsumerConfiguration implements Serializable {
 
     private int priorityLevel = 0;
 
+    @JsonIgnore
     private CryptoKeyReader cryptoKeyReader = null;
     private ConsumerCryptoFailureAction cryptoFailureAction = ConsumerCryptoFailureAction.FAIL;
 
diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/api/ProducerConfiguration.java b/pulsar-client/src/main/java/org/apache/pulsar/client/api/ProducerConfiguration.java
index be72fc7..fb098cf 100644
--- a/pulsar-client/src/main/java/org/apache/pulsar/client/api/ProducerConfiguration.java
+++ b/pulsar-client/src/main/java/org/apache/pulsar/client/api/ProducerConfiguration.java
@@ -21,6 +21,7 @@ package org.apache.pulsar.client.api;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
@@ -48,12 +49,15 @@ public class ProducerConfiguration implements Serializable {
     private int maxPendingMessagesAcrossPartitions = 50000;
     private MessageRoutingMode messageRouteMode = MessageRoutingMode.SinglePartition;
     private HashingScheme hashingScheme = HashingScheme.JavaStringHash;
+    @JsonIgnore
     private MessageRouter customMessageRouter = null;
     private long batchingMaxPublishDelayMs = 10;
     private int batchingMaxMessages = 1000;
     private boolean batchingEnabled = false; // disabled by default
 
+    @JsonIgnore
     private CryptoKeyReader cryptoKeyReader;
+    @JsonIgnore
     private ConcurrentOpenHashSet<String> encryptionKeys;
 
     private CompressionType compressionType = CompressionType.NONE;
diff --git a/pulsar-client/src/test/java/org/apache/pulsar/client/api/ConsumerConfigurationTest.java b/pulsar-client/src/test/java/org/apache/pulsar/client/api/ConsumerConfigurationTest.java
new file mode 100644
index 0000000..2e7fd80
--- /dev/null
+++ b/pulsar-client/src/test/java/org/apache/pulsar/client/api/ConsumerConfigurationTest.java
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pulsar.client.api;
+
+import static org.mockito.Mockito.mock;
+import static org.testng.Assert.assertFalse;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.Test;
+
+/**
+ * Unit test of {@link ConsumerConfiguration}.
+ */
+public class ConsumerConfigurationTest {
+
+    private static final Logger log = LoggerFactory.getLogger(ConsumerConfigurationTest.class);
+
+    @Test
+    public void testJsonIgnore() throws Exception {
+
+        ConsumerConfiguration conf = new ConsumerConfiguration()
+            .setConsumerEventListener(new ConsumerEventListener() {
+
+                @Override
+                public void becameActive(Consumer consumer, int partitionId) {
+                }
+
+                @Override
+                public void becameInactive(Consumer consumer, int partitionId) {
+                }
+            })
+            .setMessageListener((MessageListener) (consumer, msg) -> {
+            })
+            .setCryptoKeyReader(mock(CryptoKeyReader.class));
+
+        ObjectMapper m = new ObjectMapper();
+        m.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+        ObjectWriter w = m.writerWithDefaultPrettyPrinter();
+
+        String confAsString = w.writeValueAsString(conf);
+        log.info("conf : {}", confAsString);
+
+        assertFalse(confAsString.contains("messageListener"));
+        assertFalse(confAsString.contains("consumerEventListener"));
+        assertFalse(confAsString.contains("cryptoKeyReader"));
+    }
+
+}

-- 
To stop receiving notification emails like this one, please contact
mmerli@apache.org.