[ https://issues.apache.org/jira/browse/CAMEL-11623?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16112446#comment-16112446 ]
Claus Ibsen commented on CAMEL-11623: ------------------------------------- We catch throwable in many other places - this is fine as this is about loading the implementation on startup, and not while runtime routing. So I am +1 for the throwable. > LevelDB Java implementation wont be tried on Errors > --------------------------------------------------- > > Key: CAMEL-11623 > URL: https://issues.apache.org/jira/browse/CAMEL-11623 > Project: Camel > Issue Type: Bug > Components: camel-leveldb > Affects Versions: 2.19.2 > Reporter: Mart KartaĊĦev > Fix For: 2.18.5, 2.20.0, 2.19.3 > > > For a bit of background, we have been running into a problem with the LevelDB > JNI drivers for AggregationRepositories, which prevents startup when using > routes for which we require persistent aggregation. This, however, is not the > main topic of this issue. > In the latest version (2.19.2) the following issue has implemented a Java > specific leveldb factory: > https://issues.apache.org/jira/browse/CAMEL-11427 > The relevant part of the Error on startup is as follows: > java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no > leveldbjni64-1.8 in java.library.path, no leveldbjni-1.8 in > java.library.path, no leveldbjni in java.library.path, > C:\Users\atos\AppData\Local\Temp\leveldbjni-64-1-794362262645531032.8: Can't > find dependent libraries] > at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182) > at org.fusesource.hawtjni.runtime.Library.load(Library.java:140) > at org.fusesource.leveldbjni.JniDBFactory.(JniDBFactory.java:48) > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) > at > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) > > at > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) > > at java.lang.reflect.Constructor.newInstance(Constructor.java:423) > at java.lang.Class.newInstance(Class.java:442) > at > org.apache.camel.component.leveldb.LevelDBFile.getFactory(LevelDBFile.java:189) > > at org.apache.camel.component.leveldb.LevelDBFile.start(LevelDBFile.java:174) > The way that I understand the code added in issue 11427, is that the > LevelDBFile class getFactory() method (line 181) will first try to initiate > with the JNI drivers and if that fails, will turn to the pure Java > implementation. This is done by catching an Exception which is then ignored > incase the JNI driver fails. > However, when we look at the code we see that UnstatisfiedLinkError does not > extend Exception, it extends Error. > This Error is therefore not caught by the application and thus the Java > implementation for LevelDB is never even attempted to be initialized as the > method execution ends exceptionally at that point. > So the main two questions are: > 1) Was the code intended to catch this UnsatisfiedLinkageError (I know Errors > are often considered a bad thing to catch) as a means to substitute the JNI > driver, incase it fails? > 2) If it is not supposed to catch this error, how can I use the pure Java > implementation in this case? I expect that trying to exclude relevant > packages also wont work as it will directly try to initiate the the JNI > implementation by its name, which would fail also with an Error. > So, in summary: > Is line 194 in class LevelDBFile in the camel-leveldb component supposed to > catch an Error or more generally a Throwable instead of Exception? -- This message was sent by Atlassian JIRA (v6.4.14#64029)