Mina работает на Netbeans и терпит неудачу в fat-jar?

#apache-camel

#apache-camel

Вопрос:

Странная проблема, она терпит неудачу, если мы создаем fat-jar для выполнения проекта, но не из Netbeans. Есть какие-нибудь подсказки, почему?

Это простое приложение apache-camel, оно запускает маршрут с использованием Mina для получения HL7, а затем использует компонент, который напрямую отвечает на сообщение ACK, простой пример.

 <bean id="hl7codec" class="org.apache.camel.component.hl7.HL7MLLPCodec">
    <property name="charset" value="utf-8"/>
</bean>

<bean id="answerACKHL7" class="com.mycompany.AnswerEMRBean" />    

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route customId="true" id="routeID">
        <from uri="mina:tcp://localhost:8255?sync=trueamp;amp;codec=#hl7codec" />
        <bean ref="answerACKHL7" method="sendACK" />
    </route> 
</camelContext>
  

Приложение имеет другой маршрут REST, определенный java, но эта часть работает одинаково как в Netbeans, так и в исполняемом файле jar.

Если мы запустим его из Netbeans и отправим сообщение HL7 на порт, он сработает. Хорошо, мы создаем fat-jar с помощью maven-shade-plugin 3.2.4 и запускаем его с помощью java -jar jarfile.jar, кажется, все начинается нормально, затем мы отправляем то же сообщение HL7, которое работает при запуске из netbeans и получении исключения.

Копия сообщения об ошибке: GRAVE: сбой доставки для (MessageId: ID-DESKTOP-O7B5GIN-1603385955728-0-1 на ExchangeId: ИДЕНТИФИКАТОР-РАБОЧИЙ СТОЛ-O7B5GIN-1603385955728-0-1 ). Исчерпано после попытки доставки: 1 поймано: org.apache.camel.Исключение CamelExecutionException: исключение возникло во время выполнения на exchange: Exchange[]

История сообщений (полная история сообщений отключена)

 RouteId              ProcessorId          Processor                                                                        Elapsed (ms)
[routeID         ] [routeID         ] [from[mina://tcp://localhost:8255?codec=#hl7codecamp;sync=true]                 ] [        45]
        ...
[routeID         ] [bean1             ] [bean[ref:answerACKHL7 method:sendACK]                                    ] [         0]
  

Stacktrace

org.apache.camel.Исключение CamelExecutionException: исключение произошло во время выполнения на exchange: Exchange[] в org.apache.camel.Исключение CamelExecutionException.wrapCamelExecutionException(CamelExecutionException.java:47) в org.apache.camel.support.builder.ExpressionBuilder $ 32.оценить (ExpressionBuilder.java:943) в org.apache.camel.support.ExpressionAdapter.оценить(ExpressionAdapter.java:36) в org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterBinding(MethodInfo.java:748) в org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluateParameterExpressions(MethodInfo.java:640) в org.apache.camel.component.bean.MethodInfo$ParameterExpression.evaluate(MethodInfo.java:608) в org.apache.camel.component.bean.MethodInfo.createMethodInvocation(MethodInfo.java:195) в org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:265) в org.apache.camel.component.bean.AbstractBeanProcessor.process(AbstractBeanProcessor.java:135) в org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:56) в org.apache.camel.processor.processor.errorhandler.RedeliveryErrorHandler $SimpleTask.run(RedeliveryErrorHandler.java:395) в org.apache.camel.импл.движок.DefaultReactiveExecutor$Рабочий.расписание (DefaultReactiveExecutor.java:148) в org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:60) в org.apache.camel.processor.Pipeline.process(Pipeline.java:147) в org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:286) в org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83) в org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:40) в org.apache.camel.component.mina.MinaConsumer$ReceiveHandler.MessageReceived(MinaConsumer.java:409) в org.apache.mina.core.filterchain.DefaultIoFilterChain $TailFilter.MessageReceived(DefaultIoFilterChain.java:1015) в org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:650) в org.apache.mina.core.filterchain.DefaultIoFilterChain.access$ 1300(DefaultIoFilterChain.java:49) в org.apache.mina.core.filterchain.DefaultIoFilterChain $EntryImpl $1.Получено сообщение (DefaultIoFilterChain.java:1128) в org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:106) в org.apache.mina.core.session.IoEvent.run(IoEvent.java:89) в org.apache.mina.filter.executor.Упорядоченный ThreadPoolExecutor $Worker.RunTask(упорядоченный ThreadPoolExecutor.java:766) в org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:758) в org.apache.mina.filter.executor.Упорядоченный ThreadPoolExecutor $Worker.run(упорядоченный ThreadPoolExecutor.java:697) на java.lang.Thread.run (неизвестный источник), вызванный: org.apache.camel.Исключение InvalidPayloadException: недоступно тело типа: ca.uhn.hl7v2.model.Сообщение, но имеет значение: … скопируйте все сообщение здесь … типа: java.lang.Строка на: Сообщение. Вызвано: нет конвертера типов, доступного для преобразования из type: java.lang.Строка требуемого типа: ca.uhn.hl7v2.model.Сообщение со значением… копия всего сообщения HL7… . Обмен []. Вызвано: [org.apache.camel.Исключение NoTypeConversionAvailableException — нет конвертера типов, доступного для преобразования из type: java.lang.Строка требуемого типа: ca.uhn.hl7v2.model.Сообщение со значением… снова скопируйте все сообщение HL7 … ] в org.apache.camel.support.MessageSupport.getMandatoryBody(MessageSupport.java:118) в org.apache.camel.support.builder.ExpressionBuilder $ 32.оценить(ExpressionBuilder.java:941) … еще 26 Вызвано: org.apache.camel.Исключение NoTypeConversionAvailableException: нет конвертера типов, доступного для преобразования из type: java.lang.Строка требуемого типа: ca.uhn.hl7v2.model.Сообщение со значением… в org.apache.camel.impl.converter.CoreTypeConverterRegistry.mandatoryConvertTo(CoreTypeConverterRegistry.java:216 ) в org.apache.camel.support.MessageSupport.getMandatoryBody(MessageSupport.java:116) … еще 27 22 октября 2020 г., 6:59:15 ВЕЧЕРА org.apache.camel.component.mina.MinaConsumer $ ReceiveHandler exceptionCaught ADVERTENCIA: закрытие сеанса в качестве исключения было выдано из MINA 22 октября 2020 г., 6:59:15 ВЕЧЕРА org.apache.mina.core.filterchain.DefaultIoFilterChain callNextExceptionCaught ADVERTENCIA: неожиданное исключение из обработчика exceptionCaught. org.apache.camel.Исключение CamelException: org.apache.mina.filter.codec.Исключение ProtocolEncoderException: org.apache.camel.Исключение CamelExecutionException: исключение возникло во время выполнения на exchange: Exchange[] в org.apache.camel.component.mina.MinaConsumer$ReceiveHandler.exceptionCaught(MinaConsumer.java:387) в org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.exceptionCaught(DefaultIoFilterChain.java:987) в org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextExceptionCaught(DefaultIoFilterChain.java:706) в org.apache.mina.core.filterchain.DefaultIoFilterChain.access$ 1100(DefaultIoFilterChain.java:49) в org.apache.mina.core.filterchain.DefaultIoFilterChain $EntryImpl $1.exceptionCaught(DefaultIoFilterChain.java:1110) в org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:97) в org.apache.mina.core.session.IoEvent.run(IoEvent.java:89) в org.apache.mina.filter.executor.Упорядоченный ThreadPoolExecutor $Worker.RunTask(упорядоченный ThreadPoolExecutor.java:766) в org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:758) в org.apache.mina.filter.executor.Упорядоченный ThreadPoolExecutor $Worker.run(упорядоченный ThreadPoolExecutor.java:697) на java.lang.Thread.run (неизвестный источник)

Подробная информация

Версия Camel 3.2.0 Версия Java 1.8.0.221 (должна быть одинаковой как в Netbeans, так и в командной строке)

Есть идеи, почему он выходит из строя из встроенной jar???

С уважением.

Ответ №1:

При затенении зависимостей от fat jar вам необходимо указать плагину maven, как обрабатывать дублирующиеся ресурсы. В вашем случае maven-shade-plugin переопределение TypeConverterLoader , которое отвечает за преобразование типов, и, таким образом, вы получаете No type converter available to convert from type: java.lang.String to the required type исключение.

Вам необходимо настроить maven-shade-plugin объединение этого ресурса. Смотрите, как создать исполняемый файл JAR для camel-основного проекта:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <shadedClassifierName>executable-jar</shadedClassifierName>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>my.package.MainClass</mainClass>
                    </transformer>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/services/org/apache/camel/TypeConverterLoader</resource>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>
  

Комментарии:

1. Спасибо, Бедла, это отлично решило проблему! (У меня репутация менее 15, поэтому мой «полезный» голос не отображается, но записывается. Еще раз спасибо!!!