Hi all, I'm facing a really strange problem when concurrently using a model. I have created a REST webservice which is running some tasks on a model sent through a POST.
In this code, I have created an OntModel and add a resource description to it. I loop over all the statements to check and modify some values. For some of that I'm using Individual.isClass() validation. The OntModel is based on my own spec and I create it like (just a summary): private MyOntModelSpec() { super(OntModelSpec.OWL_MEM_MICRO_RULE_INF); String locatorPath = Thread.currentThread().getContextClassLoader() .getResource("").getPath(); // Locate the ont-policy.rdf file and the ontologies to be used FileManager fm = FileManager.get().clone(); // TODO: There is a bug to be reported that LocatorFiles are not // considered when added fm.addLocatorFile(locatorPath); OntDocumentManager docMngr = new OntDocumentManager(fm, "etc/my-ont-policy.rdf"); // Parsing data inside the ont-policy.rdf file StreamManager sm = StreamManager.makeDefaultStreamManager(); sm.addLocator(new LocatorFile(locatorPath)); StreamManager.setGlobal(sm); this.setDocumentManager(docMngr); } public static OntModelSpec getInstance() { if (myOntModelSpec == null) { myOntModelSpec = new myOntModelSpec(); } return myOntModelSpec; } Then the OntModel is created as: private MyOntModel() { ontModelSpec = MyOntModelSpec.getInstance(); ontModel = ModelFactory.createOntologyModel(ontModelSpec); ontModel.read("etc/my.owl", null); } public static OntModel getInstance() { if (myModel == null) { myModel = new myOntModel(); } // Automatically load all the ontologies // included in the etc/my.owl file OntModel m = ModelFactory .createOntologyModel(myModel.getOntModelSpec()); m.read("etc/my.owl", null); return m; } And I use it like: OntModel ontModel = MyOntModel.getInstance(); ontModel.add(inputFromRest); // snip Individual individual = ontModel.getIndividual("an object URI"); if (individual.isClass()) { // Do whatever } Using it one call to the webservice in a sequential way, there is no problem. However sometime when concurrently calling the webservice I'm getting a "org.apache.jena.shared.ClosedException: already closed" when doing the check/validation over the model. Caused by: org.apache.jena.shared.ClosedException: already closed at org.apache.jena.graph.impl.GraphBase.checkOpen(GraphBase.java:66) at org.apache.jena.graph.impl.GraphBase.find(GraphBase.java:240) at org.apache.jena.graph.compose.MultiUnion.multiGraphFind(MultiUnion.java:170) at org.apache.jena.graph.compose.MultiUnion.graphBaseFind(MultiUnion.java:147) at org.apache.jena.graph.impl.GraphBase.find(GraphBase.java:241) at org.apache.jena.reasoner.FGraph.findWithContinuation(FGraph.java:69) at org.apache.jena.reasoner.FinderUtil$Cascade.find(FinderUtil.java:97) at org.apache.jena.reasoner.FGraph.findWithContinuation(FGraph.java:69) at org.apache.jena.reasoner.FinderUtil$Cascade.find(FinderUtil.java:97) at org.apache.jena.reasoner.FinderUtil$Cascade.findWithContinuation(FinderUtil.java:114) at org.apache.jena.reasoner.FinderUtil$Cascade.find(FinderUtil.java:97) at org.apache.jena.reasoner.FinderUtil$Cascade.findWithContinuation(FinderUtil.java:114) at org.apache.jena.reasoner.FinderUtil$Cascade.find(FinderUtil.java:97) at org.apache.jena.reasoner.rulesys.FBRuleInfGraph.findDataMatches(FBRuleInfGraph.java:215) at org.apache.jena.reasoner.rulesys.impl.TopLevelTripleMatchFrame.<init>(TopLevelTripleMatchFrame.java:45) at org.apache.jena.reasoner.rulesys.impl.LPInterpreter.<init>(LPInterpreter.java:140) at org.apache.jena.reasoner.rulesys.impl.LPInterpreter.<init>(LPInterpreter.java:100) at org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine.generatorFor(LPBRuleEngine.java:278) at org.apache.jena.reasoner.rulesys.impl.ConsumerChoicePointFrame.init(ConsumerChoicePointFrame.java:78) at org.apache.jena.reasoner.rulesys.impl.ConsumerChoicePointFrame.<init>(ConsumerChoicePointFrame.java:66) at org.apache.jena.reasoner.rulesys.impl.LPInterpreter.setupTabledCall(LPInterpreter.java:675) at org.apache.jena.reasoner.rulesys.impl.LPInterpreter.run(LPInterpreter.java:568) at org.apache.jena.reasoner.rulesys.impl.LPInterpreter.next(LPInterpreter.java:190) at org.apache.jena.reasoner.rulesys.impl.Generator.pump(Generator.java:252) at org.apache.jena.reasoner.rulesys.impl.Generator.pump(Generator.java:239) at org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine.pump(LPBRuleEngine.java:311) at org.apache.jena.reasoner.rulesys.impl.LPTopGoalIterator.moveForward(LPTopGoalIterator.java:107) at org.apache.jena.reasoner.rulesys.impl.LPTopGoalIterator.hasNext(LPTopGoalIterator.java:223) at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90) at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90) at org.apache.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:55) at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90) at org.apache.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:55) at org.apache.jena.graph.impl.GraphBase.containsByFind(GraphBase.java:299) at org.apache.jena.graph.impl.GraphBase.graphBaseContains(GraphBase.java:277) at org.apache.jena.graph.impl.GraphBase.contains(GraphBase.java:269) at org.apache.jena.graph.impl.GraphBase.contains(GraphBase.java:286) at org.apache.jena.ontology.impl.OWLProfile$SupportsCheck.hasType(OWLProfile.java:336) at org.apache.jena.ontology.impl.OWLProfile$3.doCheck(OWLProfile.java:390) at org.apache.jena.ontology.impl.OWLProfile.isSupported(OWLProfile.java:257) at org.apache.jena.ontology.impl.OntClassImpl$1.canWrap(OntClassImpl.java:90) at org.apache.jena.enhanced.EnhNode.canSupport(EnhNode.java:168) at org.apache.jena.enhanced.EnhNode.canAs(EnhNode.java:113) at org.apache.jena.ontology.impl.OntResourceImpl.isClass(OntResourceImpl.java:1305) at mypackage.validateInput(MyClass.java:55) I don't know why it is happening. Could you give me some hint? TA for any help. Jorge