2013/7/1 Rama Shenai <rshe...@climate.com>: > Hi, > > I have an OSGI (Karaf) setup where I have two isolated instances of Clojure > deployed & running in two bundles (within the same JVM), > and I am seeing a problem where passing Clojure Objects (such as > PersistentArrayMaps) from one clojure bundle to another, breaks clojure > interfaces > at the receiving end. The two bundles communicate via a OSGI services. > > The specific problem/example is as follows: > > Lets say that I have two Clojure bundle instances running in Apache Karaf > (clj-bundle-A) and (clj-bundle-B) > > clj-bundle-A registers an interface implementation with the OSGI registry. > The interface looks like: > public interface clojureCall { > Object callMethod(Object request); > } > > clj-bundle-B looks up the interface from the OSGI registry and calls the > method, the code looks like this: > (defn call-bundle-a [] > ; service is an instance of clojureCall implemented in clj-bundle-a > (let [service (lookup-osgi-registry-bundle-a)] > ; send a map as a request > (.callMethod service {"hello" "world"}))) > > > An instance of the PersistentHashMap {"hello" "world"} is sent from > clj-bundle-B to clj-bundle-A; > However, clj-bundle-A only sees it as a Java object with its clojure > interfaces not realized. > > For example on clj-bundle-A, the passed in argument looks like >> (println request) > #<PersistentArrayMap {"hello" "world"} <== I would expect it to print > {"hello" "map"} instead it is realizing this as a Java object. > >> (println (type request)) > clojure.lang.PersistentHashMap <== The type information is saved, but the > interface is broken > >> (map? request) > false > >> (instance? java.util.Map request) <== the java interfaces are realized >> correctly > true > > I figure that the problem may be related to the two Clojure-Bundles are not > sharing any classes between them, since they are running in different > isolated bundles. > I want to have to multiple instances of clojures running so as to run > multiple versions of the sample clj file in the same JVM > > I am wondering if anyone has any suggestions on how to avoid this problem.
Hello, indeed, you have 2 clojure instances in 2 separate classloader environments. So they share nothing, even if you might think so, misguided by the fact that the fully qualified class names look identical. An interesting solution would be to refactor Clojure to extract all the interfaces into a third bundle, then make each clojure instance depend on that bundle made only of interfaces. This way, you would be able to share objects via their interfaces. Or else, at the boundaries, you'll have to serialize / deserialize the objects to / from edn, even within the same JVM. HTH, -- Laurent > > Thanks, > Rama > > -- > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. > > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.