-
Notifications
You must be signed in to change notification settings - Fork 116
Description
It seems as if my OpenJpeg processor works only when processor.selection_strategy=ManualSelectionStrategy and processor.ManualSelectionStrategy.jp2=OpenJpegProcessor.
When my cantaloupe.properties defines processor.selection_strategy=AutomaticSelectionStrategy and I try to request a jp2 image with OpenJPEG installed on my system (or via docker). The cantaloupe processing fails, actual server log doesn't show anything interesting, but the stack trace is actually included in the failed response:
500 Internal Server Error
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:74)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
at edu.illinois.library.cantaloupe.processor.ProcessorFactory.newProcessor(ProcessorFactory.java:100)
at edu.illinois.library.cantaloupe.resource.ImageRequestHandler.handle(ImageRequestHandler.java:385)
at edu.illinois.library.cantaloupe.resource.iiif.v2.ImageResource.doGET(ImageResource.java:141)
at edu.illinois.library.cantaloupe.resource.HandlerServlet.handle(HandlerServlet.java:97)
at edu.illinois.library.cantaloupe.resource.HandlerServlet.doGet(HandlerServlet.java:35)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:500)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:529)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1381)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1303)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
at org.eclipse.jetty.server.Server.handle(Server.java:563)
at org.eclipse.jetty.server.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1598)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:753)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:501)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:287)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:314)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:969)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1194)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1149)
at java.base/java.lang.Thread.run(Thread.java:1474)
Caused by: java.lang.UnsatisfiedLinkError: no kdu_jni in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2285)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:822)
at java.base/java.lang.System.loadLibrary(System.java:1685)
at kdu_jni.Kdu_message.<clinit>(Kdu_message.java:5)
at edu.illinois.library.cantaloupe.processor.codec.jpeg2000.JPEG2000KakaduImageReader.<clinit>(JPEG2000KakaduImageReader.java:197)
at edu.illinois.library.cantaloupe.processor.KakaduNativeProcessor.<init>(KakaduNativeProcessor.java:77)
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
... 31 more
The line it fails on is
cantaloupe/src/main/java/edu/illinois/library/cantaloupe/processor/ProcessorFactory.java
Line 100 in 4e3f46c
| Processor candidate = class_.getDeclaredConstructor().newInstance(); |
The thing I narrowed it down to is that because the KakaduNativeProcessor is defined FIRST in JP2_CANDIDATES (here:
cantaloupe/src/main/java/edu/illinois/library/cantaloupe/processor/AutomaticSelectionStrategy.java
Lines 13 to 16 in 4e3f46c
| private static final List<Class<? extends Processor>> JP2_CANDIDATES = List.of( | |
| KakaduNativeProcessor.class, | |
| OpenJpegProcessor.class, | |
| GrokProcessor.class); |
I tried manually replacing the order by putting OpenJpegProcessor as the first element in JP2_CANDIDATES and the request succeeds.
Am I missing an additional configuration that should try to find anything (instead of failing on the first one) available for image processors, or defining the processor order (instead of editing the source code)?