Uploaded image for project: 'Geode'
  1. Geode
  2. GEODE-8235

Server should not be required to have an available PDX type registry for ClientCache applications

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • None
    • None
    • serialization

    Description

      As an application developer using Apache Geode, if I create a ClientCache application that contains client LOCAL
      Regions only (i.e. with ClientRegionShortcut.LOCAL) and I attempt to store objects in PDX serialized format, then Geode will throw an inappropriate Exception:

      ACTUAL:

      Caused by: org.apache.geode.pdx.JSONFormatterException: Could not parse JSON document: [Source: (String)"{"@type":"example.app.model.Customer","id":1,"name":"Jon Doe"}"; line: 1, column: 63]
      	at org.apache.geode.pdx.JSONFormatter.toPdxInstance(JSONFormatter.java:206) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.pdx.JSONFormatter.fromJSON(JSONFormatter.java:134) ~[geode-core-1.12.0.jar:na]
      	at ...
      	... 39 common frames omitted
      Caused by: org.apache.geode.cache.CacheClosedException: Client pools have been closed so the PDX type registry is not available.
      	at org.apache.geode.internal.cache.GemFireCacheImpl.getCacheClosedException(GemFireCacheImpl.java:1630) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.internal.cache.GemFireCacheImpl.getCacheClosedException(GemFireCacheImpl.java:1619) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.pdx.internal.ClientTypeRegistration.getAllPools(ClientTypeRegistration.java:153) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.pdx.internal.ClientTypeRegistration.defineType(ClientTypeRegistration.java:63) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.pdx.internal.TypeRegistry.defineType(TypeRegistry.java:202) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.pdx.internal.TypeRegistry.defineLocalType(TypeRegistry.java:250) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.pdx.internal.PdxWriterImpl.completeByteStreamGeneration(PdxWriterImpl.java:540) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.pdx.internal.PdxInstanceFactoryImpl.create(PdxInstanceFactoryImpl.java:64) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.pdx.internal.json.PdxInstanceHelper.endObjectField(PdxInstanceHelper.java:209) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.pdx.JSONFormatter.getPdxInstance(JSONFormatter.java:309) ~[geode-core-1.12.0.jar:na]
      	at org.apache.geode.pdx.JSONFormatter.toPdxInstance(JSONFormatter.java:199) ~[geode-core-1.12.0.jar:na]
      	... 55 common frames omitted
      

      First of all this is not even an appropriate Exception! CacheCloseException because my client had no open Pools to an available server with a PDX type registry.

      1. Creating client local-only applications not connected to an entire cluster or server is a very useful and practical arrangement during development.

      2. My application should not have to be a peer Cache to have an available PDX type registry to store PDX instances in client LOCAL Regions.

      3. It is actually highly useful to run my application in local-only mode, in a local-only context (i.e. with only client LOCAL Regions) without a cluster or server for development, testing and debugging purposes.

      4. It is also really useful if my application can also store PDX bytes, even in client LOCAL (only) Regions for development, testing and debugging purposes.

      Some find it hard to imagine why an application would want to do this, store PDX instead of POJOs. However, consider the fact that my application might be part of a larger Microservices architecture that communicate via a RESTful interfaces. They pass JSON back and forth, which might either be complex or unstructured. Either way, it is possible I don't have or don't want to create POJOs (types) matching the JSON that my Microservice consumes. I simply want access to certain bits of information which PDX is adequately suited for. These client LOCAL Regions might even be temporary. When connected, I might even want to share this data (or aggregated data) with Native Clients which most certainly won't have Java types matching the JSON content, raw or summarized.

      EXPECTED:

      As a developer using Apache Geode, I expected to be able to develop (primarily) ClientCache applications, run them locally with client LOCAL Regions, storing data in PDX format as necessary, all without requiring a complex setup (e.g. such as a cluster or a server).

      Attachments

        Activity

          People

            Unassigned Unassigned
            jblum John Blum
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated: