[ 
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)

Reply via email to