Не удалось связать MDB с адаптером входящих ресурсов в Wildfly 10.x — сбой развертывания.

Я запрограммировал простой адаптер входящих ресурсов TCP (RA) в качестве пример проекта на github и успешно развернул его на wildfly 10.x с автономной полной конфигурацией. Интерфейс прослушивателя сообщений TcpMessageListener расположен в RA и определен в дескрипторе ra.xml, но я не могу подключить к нему bean-компонент, управляемый сообщениями (MDB). Сторона eis RA работает как положено, я могу подключаться/отправлять сообщения с помощью telnet. Когда я пытаюсь развернуть MDB с плагином wildfly maven, MDB не смог найти TcpMessageListener, и я получил java.lang.NoClassDefFoundError:

WARN  [org.jboss.modules] (MSC service thread 1-7) Failed to define class de.bitc.ejb.InboundEventHandler in Module "deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main" from Service Module Loader: java.lang.NoClassDefFoundError: Failed to link de/bitc/ejb/InboundEventHandler (Module "deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main" from Service Module Loader): de/bitc/jca/inflow/TcpMessageListener
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  .
  .
  .
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC000001: Failed to start service jboss.deployment.subunit."ra-ear.ear"."ra-user-ejb-0.0.1-SNAPSHOT.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."ra-ear.ear"."ra-user-ejb-0.0.1-SNAPSHOT.jar".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of subdeployment "ra-user-ejb-0.0.1-SNAPSHOT.jar" of deployment "ra-ear.ear"
  .
  .
  .
Caused by: java.lang.NoClassDefFoundError: Failed to link de/bitc/ejb/InboundEventHandler (Module "deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main" from Service Module Loader): de/bitc/jca/inflow/TcpMessageListener
  .
  .
  .
ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 17) WFLYCTL0013: Operation ("add") failed - address: ([("deployment" => "ra-ear.ear")]) - failure description: {
"WFLYCTL0080: Failed services" => {"jboss.deployment.subunit.\"ra-ear.ear\".\"ra-user-ejb-0.0.1-SNAPSHOT.jar\".POST_MODULE" => "org.jboss.msc.service.StartException in service jboss.deployment.subunit.\"ra-ear.ear\".\"ra-user-ejb-0.0.1-SNAPSHOT.jar\".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of subdeployment \"ra-user-ejb-0.0.1-SNAPSHOT.jar\" of deployment \"ra-ear.ear\"
Caused by: java.lang.NoClassDefFoundError: Failed to link de/bitc/ejb/InboundEventHandler (Module \"deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main\" from Service Module Loader): de/bitc/jca/inflow/TcpMessageListener"},
"WFLYCTL0412: Required services that are not installed:" => ["jboss.deployment.subunit.\"ra-ear.ear\".\"ra-user-ejb-0.0.1-SNAPSHOT.jar\".POST_MODULE"],
"WFLYCTL0180: Services with missing/unavailable dependencies" => undefined

Зависимость в подмодуле ejb maven находится в области provided. Я следил за развертыванием RA в redhat руководство. Я также переключил в подмодуле ejb зависимость maven адаптера ресурсов от предоставленной для компиляции. В этом случае я получил следующие ошибки

[ERROR] Caused by: java.lang.IllegalStateException: WFLYEJB0383: No message listener of type de.bitc.jca.inflow.TcpMessageListener found in resource adapter tcp-eis.rar"},
  "WFLYCTL0412: Required services that are not installed:" => ["jboss.deployment.subunit.\"ra-ear.ear\".\"ra-user-ejb-0.0.1-SNAPSHOT.jar \".component.InboundEventHandler.CREATE"],
  "WFLYCTL0180: Services with missing/unavailable dependencies" => undefined}}}

вот это МДБ

package de.bitc.ejb;

import java.util.logging.Logger;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;

import org.jboss.ejb3.annotation.ResourceAdapter;

import de.bitc.jca.inflow.TcpMessageListener;

@MessageDriven(
    activationConfig = {
            @ActivationConfigProperty(propertyName = "topic",  propertyValue = "test")
        } //, messageListenerInterface = TcpMessageListener.class
        )
@ResourceAdapter(value="tcp-eis.rar")
public class InboundEventHandler implements TcpMessageListener {

    /** The logger */
    private static Logger log = Logger.getLogger(InboundEventHandler.class.getName());

    /**
     * Default constructor.
     */
    public InboundEventHandler() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see TcpMessageListener#onMessage(String)
     */
    @Override
    public void onMessage(String msg) {
        // TODO Auto-generated method stub
    }
}

Вот TcpListenerInterface

package de.bitc.jca.inflow;

/**
 * TcpMessageListener
 *
 * @version $Revision: $ 
 */
public interface TcpMessageListener {
    /**
     * Receive message
     * 
     * @param msg
     *            String.
     */
    public void onMessage(String msg);
}

Вот настройки адаптера ресурсов в jboss_cli

 /subsystem=resource-adapters/resource-adapter=tcp-eis.rar:read-resource(recursive=true)
{
    outcome => success,
    result => {
        archive => tcp-eis.rar,
        beanvalidationgroups => undefined,
        bootstrap-context => undefined,
        config-properties => undefined,
        module => undefined,
        statistics-enabled => false,
        transaction-support => XATransaction,
        wm-security => false,
        wm-security-default-groups => undefined,
        wm-security-default-principal => undefined,
        wm-security-domain => other,
        wm-security-mapping-groups => undefined,
        wm-security-mapping-required => false,
        wm-security-mapping-users => undefined,
        admin-objects => undefined,
        connection-definitions => undefined
    }
}

Мой вопрос заключается в том, есть ли недостающий шаг в развертывании, когда MDB находит адаптер ресурсов. Я думаю, это делается с помощью аннотации @ResourceAdapter? Мне нужно было определить очередь или что-то в этом роде? Ресурсы об адаптерах входящих ресурсов очень редки, и большинство примеров — это адаптеры исходящих ресурсов. Заранее спасибо.

Приведенный выше пример inbound-ra-example размещен на github. Я описал все шаги по его сборке и запуску в файле README.md в проекте github. Я хочу разместить этот пример для других, у которых есть такие же проблемы с поиском документации.


person Jochen Buchholz    schedule 06.10.2017    source источник


Ответы (1)


Я решил ошибку загрузки класса NoClassDefFoundError: Failed to link, и теперь работающий пример отвечает на многие открытые вопросы. Я помещаю все детали в свой пример. Адаптер входящих ресурсов теперь работает как подразвертывание в архиве уха на wildfly 10 (WF10). Я создал адаптер входящих ресурсов с помощью файла IronJacamar codegenerator. Я описал все шаги сборки и запуска в примере.

Основные ошибки, где я не использовал дескриптор jboss-deployment-structure в архиве уха и зависимость maven от API адаптера ресурсов в архиве уха. Засунул зависимость в ухо при тестировании и забыл.

<?xml version="1.0" encoding="UTF-8"?>  
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">  
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated>  
    <sub-deployment name="ra-user-ejb.jar">  
        <dependencies>  
            <module name="deployment.ra-ear.ear.tcp-eis.rar"  export="true" />  
        </dependencies>  
    </sub-deployment>  
</jboss-deployment-structure>

Вот мои самые большие встроенные ответы на входящие RA, чтобы немного решить утечку документации:

  • Дескриптор ra.xml не нужен, достаточно аннотации @Connector в классе RA.
  • В WF10 не требуется дополнительной настройки. Никаких очередей, модификации standalone-full.xml или прочего jndi. Простое развертывание с плагином wildfly-maven работает.
  • Теперь работающий адаптер ресурсов не отображается как адаптер ресурсов в WF10. Это сбивает меня с толку и очень затрудняет мое исследование.
  • Дескриптор jboss-ejb3.xml не нужен. @ResourceAdapter(value="ra-ear.ear#tcp-eis.rar") достаточно. Будьте осторожны, это аннотация jboss, а не ee7. Таким образом, вы не найдете никаких ресурсов, например, в случае. вебсфера или томи.

В ближайшие дни я расширим пример адаптера ресурсов до полноценного приложения ee7 и надеюсь, что этот пример поможет другим пройти через ад документации адаптера входящих ресурсов.

person Jochen Buchholz    schedule 17.10.2017