WildFly Notes
本文列出一些 WildFly 配置过程中的注意事项,会不停的更新:
配置数据库
WildFly 的数据库使用 JCA
规范,在 Wildfly /subsystem=datasources/
下。 推荐使用 DataSource 获取数据库连接,因为可以有更好的连接池和分布式事务的支持。
配置数据库的 <connection-url>
很多时候系统管理员习惯使用老式的 connection-url
进行数据库配置,需要注意以下错误:
Unexpected character '=' (code 61); expected a semi-colon
这是因为 &
要使用 &
来 escapse,否则 xml 解析就会以为这是个 entity,尝试去解析。
集群
Wildfly 的集群可以使用 standalone,或者 domain 方式。 我比较倾向使用 standalone 的方式启动。
bin/standalone.sh -c standalone-ha.xml
WildFly 使用 JGroups 建立集群。
指定集群的 Node 名称
使用 -Djboss.node.name=node1
可以为集群的 wildfly 节点配置名称。
注意要在整个集群中唯一。
要使用 -ha.xml 配置。
|
bin/standalone.sh -c standalone-ha.xml -Djboss.node.name=node1
EJB
从 JBoss AS 7 到 WildFly 8, 以及最近的 19。 EJB client 已有了很多版本和修改。作者打算开出一系列的文章从 JBoss AS 7(EAP 6) 到最新的 WildFly 19 的 EJB Client 的变化以及如何进行 remote ejb invocation。 届时会把连接更新在本文中。
EJB lookup
-
使用
ejb:
进行 EJB lookup 意味着都是remote
的 ejb。
Arquillian
Arquillian 主要用来进行 integration 测试。 它会先启动一个 container,再部署一个测试应用,然后运行所有的 @Test
方法。
Arquillian 使用 src/test/resources/arquillian.xml
文件来找寻 container。
Arquillian 针对 WildFly 的两种模式
-
managed
示例:
<container qualifier="wildfly-managed" default="true">
<!-- By default, Arquillian will use the JBOSS_HOME environment variable to find the JBoss EAP installation.
If you prefer not to define the JBOSS_HOME environment variable, alternatively you can uncomment the
following `jbossHome` property and replace EAP_HOME with the path to your JBoss EAP installation. -->
<!--<configuration>
<property name="jbossHome">EAP_HOME</property>
</configuration> -->
</container>
这里当运行 test 的时候, arquillian 会默认使用 wildfly-managed
这个 container,配置里通过 jbossHome
来指定本地 WildFly server 的根目录。 也可以通过设置 $JBOSS_HOME
这个 environment 来指定。
-
remote
示例:
<container qualifier="wildfly-remote">
<configuration>
<property name="managementAddress">localhost</property>
<property name="managementPort">9990</property>
<property name="username">admin</property>
<property name="password">admin</property>
</configuration>
</container>
这时,我们需要通过 -Darquillian.launch=wildfly-remote
指定 container id。 这个 container 的配置是通过 host 和 port 的方式来指定。
需要先通过 bin/add-user.sh -u admin -p admin -s 给 WildFly 添加 Management 用户。
|
mvn clean test -Parq-remote -Darquillian.launch=wildfly-remote
这里 -Parq-remote 一般把 arquillian 需要的 maven dependencies 定义好:
|
<profile>
<!-- An optional Arquillian testing profile that executes tests in a remote JBoss EAP instance.
Run with: mvn clean verify -Parq-remote -->
<id>arq-remote</id>
<dependencies>
<dependency>
<groupId>org.wildfly.arquillian</groupId>
<artifactId>wildfly-arquillian-container-remote</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${version.failsafe.plugin}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
同样的, arq-managed
:
<profile>
<!-- An optional Arquillian testing profile that executes tests in your JBoss EAP instance.
This profile will start a new JBoss EAP instance, and execute the test, shutting it down when done.
Run with: mvn clean verify -Parq-managed -->
<id>arq-managed</id>
<dependencies>
<dependency>
<groupId>org.wildfly.arquillian</groupId>
<artifactId>wildfly-arquillian-container-managed</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${version.failsafe.plugin}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
JNDI Lookup
The Jakarta EE platform specification defines the following JNDI contexts:
-
java:comp
- The namespace is scoped to the current component (i.e. EJB) -
java:module
- Scoped to the current module -
java:app
- Scoped to the current application -
java:global
- Scoped to the application server
In addition to the standard namespaces, WildFly also provides the following two global namespaces:
-
java:jboss
-
java:/
Only entries within the
java:jboss/exported
context are accessible over remote JNDI.
For web deployments
java:comp
is aliased tojava:module
, so EJB’s deployed in a war do not have their own comp namespace.
JNDI binding
-
hen using CLI to specify a new JNDI name
java:
can be ignored.