だから私はすでにこれにかなりの時間を費やしてきましたが、今では完全に頭がおかしいところまで来ています...
要件: wildfly 10.1.0 ベースのメッセージ駆動型 Bean を外部の activemq 5.15.0 サーバー (artemis mq ではなく「古い」activemq!) に接続しようとしています。このために、リソース アダプターをデプロイし、構成を微調整しています。wildfly の標準的な展開では、これは問題なく機能します。次のスクリプトを使用してコンテナーをセットアップしています。
# Disable the artemis messaging completely
/subsystem=messaging-activemq/server=default:remove
# Deploy the resource adapter
deploy ${project.build.directory}/activemq-rar-5.15.0.rar
/subsystem=resource-adapters/resource-adapter=activemq-rar.rar:add(archive=activemq-rar-5.15.0.rar,transaction-support=LocalTransaction)
/subsystem=resource-adapters/resource-adapter=activemq-rar.rar/config-properties=ServerUrl:add(value="${activemq.broker}")
/subsystem=resource-adapters/resource-adapter=activemq-rar.rar/config-properties=UserName:add(value="${jboss.user}")
/subsystem=resource-adapters/resource-adapter=activemq-rar.rar/config-properties=Password:add(value="${jboss.password}")
/subsystem=resource-adapters/resource-adapter=activemq-rar.rar/config-properties=UseInboundSession:add(value="false")
/subsystem=resource-adapters/resource-adapter=activemq-rar.rar/connection-definitions=AMQConnectionFactory:add(jndi-name=ConnectionFactory,class-name=org.apache.activemq.ra.ActiveMQManagedConnectionFactory,enabled=true,min-pool-size=1,max-pool-size=20,pool-prefill=false,same-rm-override=false,use-java-context=true)
/subsystem=resource-adapters/resource-adapter=activemq-rar.rar/admin-objects=REQUESTQUEUE:add(class-name=org.apache.activemq.command.ActiveMQQueue,jndi-name=queues/request,use-java-context=true)
/subsystem=resource-adapters/resource-adapter=activemq-rar.rar/admin-objects=REPLYQUEUE:add(class-name=org.apache.activemq.command.ActiveMQQueue,jndi-name=queues/reply,use-java-context=true)
/subsystem=ejb3:write-attribute(name=default-resource-adapter-name,value=activemq-rar.rar)
/subsystem=ejb3:write-attribute(name=default-mdb-instance-pool,value=mdb-strict-max-pool)
/subsystem=ee/service=default-bindings:write-attribute(name=jms-connection-factory,value=java:/ConnectionFactory)
reload
この構成により、(JMS 関連のクラスも取得するために) スタンドアロンの完全な構成でコンテナーを起動でき、意図したとおりに動作します。
しかし、wildfly swarm で同じことを達成しようとすると、同じテスト mdb.jar をデプロイできず、コンテナーの起動時に次の例外が発生します。
"WFLYCTL0412: Required services that are not installed:" => ["jboss.ra.activemq-rar"],
"WFLYCTL0180: Services with missing/unavailable dependencies" => ["jboss.deployment.unit.\"mdbtest.jar\".component.TestMDB.CREATE is missing [jboss.ra.activemq-rar]"]
そのため、リソース アダプタは使用できないようですが、デプロイした管理コンソールにも表示されます。
swarm コンテナーをセットアップするには、次の project-defaults.xml を使用します。
swarm:
resource-adapters:
resource-adapters:
activemq-rar:
archive: activemq-rar-15.5.0.rar
transaction-support: LocalTransaction
config-properties:
ServerUrl:
value: failover:tcp://localhost:61616
UserName:
value: admin
Password:
value: admin
UseInboundSession:
value: false
connection-definitions:
AMQConnectionFactory:
jndi-name: ConnectionFactory
class-name: org.apache.activemq.ra.ActiveMQManagedConnectionFactory
enabled: true
min-pool-size: 1
max-pool-size: 20
pool-prefill: false
same-rm-override: false
use-java-context: true
same-rm-override: false
admin-objects:
REQUESTQUEUE:
class-name: org.apache.activemq.command.ActiveMQQueue
jndi-name: queues/request
use-java-context: true
REPLEYQUEUE:
class-name: org.apache.activemq.command.ActiveMQQueue
jndi-name: queues/reply
use-java-context: true
ejb3:
# Switch the MDB default to the resource adapter defined above
default-resource-adapter-name: activemq-rar
default-mdb-instance-pool: mdb-strict-max-pool
ee:
default-bindings:
jms-connection-factory: java:/ConnectionFactory
management:
security-realms:
ManagementRealm:
in-memory-authentication:
users:
admin:
password: admin
http-interface-management-interface:
allowed-origins:
- http://localhost:8080
security-realm: ManagementRealm
messaging-activemq:
servers:
default:
# active: false
# connection-factories:
# InVmConnectionFactory:
# client-id: blahblabla
# block-on-acknowledge: true
# entries:
# - "java:/ArtemisConnectionFactory"
# pooled-connection-factories:
# activemq-ra:
# entries:
# connectors: in-vm
# transaction: xa
jca:
archive-validation:
enabled: false
datasources:
jdbc-drivers:
org.postgresql:
driver-class-name: org.postgresql.Driver
xa-datasource-class-name: org.postgresql.xa.PGXADataSource
driver-module-name: org.postgresql
data-sources:
myDS:
connection-url: jdbc:postgresql://localhost:5432/mydb
user-name: dbuser
password: dbpassword
driver-name: postgresql
jndi-name: java:jboss/datasources/myDS
min-pool-size: 4
max-pool-size: 64
use-ccm: false
deployment:
org.apache.activemq:activemq-rar.rar:
com.oneworldsync.mdb:mdbtest.jar:
org.postgresql:postgresql.jar:
logging:
loggers:
org.jboss:
level: warn
org.wildfly:
level: warn
pom の関連部分は次のようになります。
<build>
<plugins>
<plugin>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-plugin</artifactId>
<version>2017.4.0</version>
<executions>
<execution>
<id>package</id>
<goals>
<goal>package</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.oneworldsync.mdb</groupId>
<artifactId>mdbtest</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>logging</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>datasources</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>undertow</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.1.4</version>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>cdi</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>jpa</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>msc</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>infinispan</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>messaging</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>jca</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>resource-adapters</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-rar</artifactId>
<version>${activemq.version}</version>
<type>rar</type>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>management</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>management-console</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>cli</artifactId>
<version>${jboss.version}</version>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>ejb</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>connector</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>jaxrs</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>remoting</artifactId>
</dependency>
</dependencies>
MDB のテストは簡単です。
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode",
propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destination",
propertyValue = "request"),
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue")
})
public class TestMDB implements MessageListener {
@Resource(name = "java:/ConnectionFactory")
private QueueConnectionFactory queueConnectionFactory;
@Override
public void onMessage(Message message) {
System.out.println(message);
}
}
そのため、MDB がリソース アダプタにアクセスできない理由のヒントを探しています。リソース アダプタがデプロイされていて、表示されていて、適切な名前を使用している場合でもです。現時点では単純なものだと思いますが、見つかりません。
どうもありがとう!
PS: 外部の activemq サーバーは必須です。JMS ブリッジを使用するとおそらく動作しますが、許容できないいくつかの欠点があります (追加の「ホップ」によるパフォーマンスへの影響、宛先への jms-reply-to は、jms ブリッジでは機能しません)。
編集 1
Arg、投稿後、pom に少なくとも 1 つの問題が見つかりました: Swarm プラグインのバージョンが一致していません: Swarm の分数は 2017.10.0 ですが、プラグインは 2017.4.0 です。これを修正すると、エラーの症状が少し変わります。
2017-10-26 09:21:07,731 ERROR [stderr] (main) Caused by: java.lang.RuntimeException: org.wildfly.swarm.container.DeploymentException: org.wildfly.swarm.container.DeploymentException: WFSWARM0004: Deployment failed: {"WFLYCTL0412: Required services that are not installed:" => ["jboss.ra.activemq-rar"],"WFLYCTL0180: Services with missing/unavailable dependencies" => ["jboss.deployment.unit.\"mdbtest.jar\".component.TestMDB.CREATE is missing [jboss.ra.activemq-rar]"]}
2017-10-26 09:21:07,732 ERROR [stderr] (main) at org.wildfly.swarm.spi.api.ClassLoading.withTCCL(ClassLoading.java:45)
2017-10-26 09:21:07,732 ERROR [stderr] (main) at org.wildfly.swarm.container.runtime.ServerBootstrapImpl.bootstrap(ServerBootstrapImpl.java:114)
2017-10-26 09:21:07,732 ERROR [stderr] (main) at org.wildfly.swarm.Swarm.start(Swarm.java:386)
2017-10-26 09:21:07,732 ERROR [stderr] (main) at org.wildfly.swarm.Swarm.main(Swarm.java:720)
2017-10-26 09:21:07,732 ERROR [stderr] (main) ... 6 more
そのため、その下にクラスローディングの問題があるようです。これを調査しますが、さらに情報を提供していただけると幸いです
編集 2
上記のスタック トレースは無関係のようです。実際には、swarm 化されたアプリケーションの起動方法に違いがあります。
- java -jar something.app で開始: スタックトレースなし
- mv nwildfly-swarm:run: 上記のスタックトレースから始めます。
ただし、基本的な原因は同じです (依存関係が見つかりません)。Mavenプラグインが呼び出しに追加のレイヤーを追加し、追加のスタックトレースをログに記録すると解釈しますが、問題は同じです。