Не удалось связать MDB с адаптером входящих ресурсов в Wildfly 10.x - развертывание не выполнено
Я запрограммировал простой адаптер входящего ресурса tcp (RA) в качестве примера проекта на github и успешно развернул его в wildfly 10.x с полной конфигурацией. Слушатель сообщений TcpMessageListener
Интерфейс находится в RA и определен в дескрипторе ra.xml, но я не могу подключить к нему компонент, управляемый сообщениями (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 Guide. Я также переключил в подмодуле 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
аннотаций? Мне нужно было определить очередь или что-то? Ресурсы об адаптерах входящих ресурсов очень редки, и большинство примеров - это адаптеры исходящих ресурсов. Заранее спасибо.
Вышеприведенный связанный входящий-ra-пример размещен на github. Я описал все шаги для сборки и запуска в README.md в проекте github. Я хочу разместить этот пример для других, у которых есть те же проблемы, чтобы найти документацию.
1 ответ
Я решил загрузку класса NoClassDefFoundError: Failed to link
Ошибка и запущенный пример отвечают на многие открытые вопросы. Я привел все детали в мой пример. Адаптер входящих ресурсов теперь работает как вспомогательное развертывание в архиве ear на wildfly 10 (WF10). Я сгенерировал адаптер входящего ресурса с IronJacamar codegenerator
, Я описал все шаги, как построить и запустить в примере.
Основные ошибки, где я не использовал jboss-deployment-structure
дескриптор в архиве ear и зависимость maven от API адаптера ресурсов в архиве ear. Я положил зависимость в ухо во время тестирования и забыл ее.
<?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
аннотации в классе РА достаточно. - В WF10 нет необходимости в дополнительной настройке. Нет очередей, standallone-full.xml модификации или jndi вещи. Простое развертывание с плагином wildfly-maven-plugin работает.
- Теперь работающий адаптер ресурсов не отображается как адаптер ресурсов в WF10. Это смущает меня и делает мои исследования очень трудными.
jboss-ejb3.xml
дескриптор не нужен.@ResourceAdapter(value="ra-ear.ear#tcp-eis.rar")
достаточно. Будьте осторожны, это аннотация jboss, а не ee7. Таким образом, вы не найдете никаких ресурсов в случае, например. Websphere или Tomee.
Я расширю пример адаптера ресурсов в ближайшие дни до полноценного приложения ee7 и надеюсь, что этот пример поможет другим на пути сквозь ад документации документации адаптера входящих ресурсов.