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 to java: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.