由于实验室项目需要,将EJB 3.0的程序部署在JBoss AS 7.1.1.Final中,并要求支持IPv4与IPv6。但其默认配置并不支持IPv6,于是查阅JBoss Community Documentation,即官方文档,在5.4.1 Interfaces and ports节中找到了相关介绍,研究后对JBoss进行配置修改,使JBoss中EJB 3.0的程序能够在IPv4和IPv6双栈环境下正常运行,包括客户端在IPv4环境下获取Remote远程接口对象,调用远程对象的方法收发IPv6的udp报文等。本文不细讲EJB程序,只介绍如何配置JBoss使其支持IPv4和IPv6双栈环境。
文章结构:
第一部分——JBoss7.1官方文档中关于IPv6部分的说明
第二部分——项目中针对JBoss配置文件修改的详细介绍
5.4.1 Interfaces and ports
Interface declarations
domain.xml, host.xml 和standalone.xml 都包含声明接口的部分。当我们看这些在XML文件中接口声明时,就会发现接口的选择条件(selection criteria)有两种类型:一种是单独的XML元素,接口绑定到通配符地址;另外一种是接口或者地址有一个或者多个特征值需要满足。
举例说明,首先是一个接口条件选择的例子,每个接口都有特定的IP地址:
<interfaces>
<interface name="management">
<inet-address value="127.0.0.1"/>
</interface>
<interface name="public">
<inet-address value="127.0.0.1"/>
</interface>
</interfaces>
接着是使用通配符的例子:
<interface name="global">
<!-- Use the wildcard address -->
<any-address/>
</interface>
<interface name="ipv4-global">
<!-- Use the IPv4 wildcard address -->
<any-ipv4-address/>
</interface>
<interface name="ipv6-global">
<!-- Use the IPv6 wildcard address -->
<any-ipv6-address/>
</interface>
<interface name="external">
<nic name="eth0"/>
</interface>
Socket Binding Groups
JBoss AS 7中socket的配置类似于interface的声明,Sockets用一个逻辑名来声明,可以在整个配置中引用。 多个Sockets声明可以用一个特定的名字声明成为一个组。这样在配置一个在管理域里的server group时可以方便的引用一个特定的socket binding group。Socket binding group通过接口逻辑名来引用接口:
<socket-binding-group name="standard-sockets" default-interface="public">
<socket-binding name="jndi" port="1099"/>
<socket-binding name="jmx-connector-registry" port="1090"/>
<socket-binding name="jmx-connector-server" port="1091"/>
<socket-binding name="http" port="8080"/>
<socket-binding name="https" port="8443"/>
<socket-binding name="jacorb" port="3528"/>
<socket-binding name="jacorb-ssl" port="3529"/>
<socket-binding name="osgi-http" port="8090"/>
<socket-binding name="remoting" port="4447"/>
<socket-binding name="txn-recovery-environment" port="4712"/>
<socket-binding name="txn-status-manager" port="4713"/>
<socket-binding name="messaging" port="5445"/>
<socket-binding name="messaging-throughput" port="5455"/>
</socket-binding-group>
一个socket binding 包含以下信息:
IPv4 versus IPv6
JBoss AS7 supports the use of both IPv4 and IPv6 addresses. By default, AS7 is configured for use in an IPv4 network and so if you are running AS7 in an IPv4 network, no changes are required. If you need to run AS7 in an IPv6 network, the changes required are minimal and involve changing the JVM stack and address preferences, and adjusting any interface IP address values specified in the configuration (standalone.xml or domain.xml).
Stack and address preference
The system properties java.net.preferIPv4Stack and java.net.preferIPv6Addresses are used to configure the JVM for use with IPv4 or IPv6 addresses. With AS7, in order to run using IPv4 addresses, we need to specify java.net.preferIPv4Stack=true; in order to run the AS7 with IPv6 addresses, we need to specify java.net.preferIPv4Stack=false (the JVM default) and java.net.preferIPv6Addresses=true. The latter ensures that any hostname to IP address conversions always return IPv6 address variants.
These system properties are conveniently set by the JAVA_OPTS environment variable, defined in the standalone.conf (or domain.conf) file. For example, to change the IP stack preference from its default of IPv4 to IPv6, edit the standalone.conf (or domain.conf) file and change its default IPv4 setting:
if [ "x$JAVA_OPTS" = "x" ]; then
JAVA_OPTS=" ... -Djava.net.preferIPv4Stack=true ..."
...
to an IPv6 suitable setting:
if [ "x$JAVA_OPTS" = "x" ]; then
JAVA_OPTS=" ... -Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true ..."
...
IP address literals
To change the IP address literals referenced in standalone.xml (or domain.xml), first visit the interface declarations and ensure that valid IPv6 addresses are being used as interface values. For example, to change the default configuration in which the loopback interface is used as the primary interface, change from the IPv4 loopback address:
<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:127.0.0.1}"/>
</interface>
</interfaces>
to the IPv6 loopback address:
<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:[::1]}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:[::1]}"/>
</interface>
</interfaces>
Note that when embedding IPv6 address literals in the substitution expression, square brackets surrounding the IP address literal are used to avoid ambiguity. This follows the convention for the use of IPv6 literals in URLs.
Over and above making such changes for the interface definitions, you should also check the rest of your configuration file and adjust IP address literals from IPv4 to IPv6 as required.
根据如上的介绍,为了使JBoss支持IPv6,我们需要修改JBoss的两个配置文件。其一,修改standalone.xml中接口声明部分和socket端口绑定;其二,修改standalone.conf里面的JVM stack和address preferences。
打开后可看到接口声明部分(interfaces)和socket端口绑定部分(socket-binding-group—)初始状态如下。接口声明中management、public、unsecure都指定的是jboss的本地回环地址,socket绑定默认接口就是public,前三个指定的是management接口,unsecure接口未使用。
<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:127.0.0.1}"/>
</interface>
<interface name="unsecure">
<inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"/>
</interface>
</interfaces>
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
<socket-binding name="management-native" interface="management" port="${jboss.management.native.port:9999}"/>
<socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
<socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9443}"/>
<socket-binding name="ajp" port="8009"/>
<socket-binding name="http" port="8080"/>
<socket-binding name="https" port="8443"/>
<socket-binding name="osgi-http" interface="management" port="8090"/>
<socket-binding name="remoting" port="4447"/>
<socket-binding name="txn-recovery-environment" port="4712"/>
<socket-binding name="txn-status-manager" port="4713"/>
<outbound-socket-binding name="mail-smtp">
<remote-destination host="localhost" port="25"/>
</outbound-socket-binding>
</socket-binding-group>
为满足JBoss能够支持IPv4和IPv6双栈环境,则要将接口的选择条件修改为绑定到通配符状态,即<any-address/>,而socket绑定部分可不做修改,
接口声明部分修改后如下:
<interfaces> <interface name="management"> <any-address/> </interface> <interface name="public"> <any-address/> </interface> <interface name="unsecure"> <inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"/> </interface> </interfaces>
注意这里修改的不是standalone.conf文件,因为修改该文件并没有使IPv6 address生效,亲测只有修改standalone.conf.bat文件才会生效。修改方法和第一部分里面Stack and address preference小节介绍一样,就是将-Djava.net.preferIPv4Stack=true修改为-Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true即可,这样JVM启动的时候默认的是IPv6格式的地址,查看打印输出即可验证正确与否。
Calling "K:\jboss-as-7.1.1.Final\bin\standalone.conf.bat"
===============================================================================
JBoss Bootstrap Environment
JBOSS_HOME: K:\jboss-as-7.1.1.Final
JAVA: C:\Program Files (x86)\Java\jdk1.7.0_79\bin\java
JAVA_OPTS: -XX:+TieredCompilation -Dprogram.name=standalone.bat -Xms64M -Xmx51
2M -XX:MaxPermSize=256M -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.se
rver.gcInterval=3600000 -Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Ad dresses=true -Dorg.jboss.resolver.warning=true -Djboss.modules.system.pkgs=org.j
boss.byteman -Djboss.server.default.config=standalone.xml
===============================================================================
22:39:47,729 信息 [org.jboss.modules] JBoss Modules version 1.1.1.GA
22:39:48,182 INFO [org.jboss.msc] JBoss MSC version 1.0.2.GA
22:39:48,322 INFO [org.jboss.as] JBAS015899: JBoss AS 7.1.1.Final "Brontes" sta
rting
22:39:50,572 INFO [org.xnio] XNIO Version 3.0.3.GA
22:39:50,572 INFO [org.jboss.as.server] JBAS015888: Creating http management se
rvice using socket-binding (management-http)
22:39:50,604 INFO [org.xnio.nio] XNIO NIO Implementation Version 3.0.3.GA
22:39:50,619 INFO [org.jboss.remoting] JBoss Remoting version 3.2.3.GA
22:39:50,666 INFO [org.jboss.as.logging] JBAS011502: Removing bootstrap log han
dlers
22:39:50,682 INFO [org.jboss.as.clustering.infinispan] (ServerService Thread Po
ol -- 31) JBAS010280: Activating Infinispan subsystem.
22:39:50,729 INFO [org.jboss.as.naming] (ServerService Thread Pool -- 38) JBAS0
11800: Activating Naming Subsystem
22:39:50,744 INFO [org.jboss.as.configadmin] (ServerService Thread Pool -- 26)
JBAS016200: Activating ConfigAdmin Subsystem
22:39:50,776 INFO [org.jboss.as.connector] (MSC service thread 1-1) JBAS010408:
Starting JCA Subsystem (JBoss IronJacamar 1.0.9.Final)
22:39:50,776 INFO [org.jboss.as.security] (ServerService Thread Pool -- 44) JBA
S013101: Activating Security Subsystem
22:39:50,807 INFO [org.jboss.as.mail.extension] (MSC service thread 1-1) JBAS01
5400: Bound mail session [java:jboss/mail/Default]
22:39:50,791 INFO [org.jboss.as.naming] (MSC service thread 1-8) JBAS011802: St
arting Naming Service
22:39:50,885 INFO [org.jboss.as.webservices] (ServerService Thread Pool -- 48)
JBAS015537: Activating WebServices Extension
22:39:51,010 INFO [org.jboss.as.osgi] (ServerService Thread Pool -- 39) JBAS011
940: Activating OSGi Subsystem
22:39:51,010 INFO [org.jboss.as.connector.subsystems.datasources] (ServerServic
e Thread Pool -- 27) JBAS010403: Deploying JDBC-compliant driver class org.h2.Dr
iver (version 1.3)
22:39:51,026 INFO [org.jboss.as.security] (MSC service thread 1-2) JBAS013100:
Current PicketBox version=4.0.7.Final
22:39:51,385 INFO [org.jboss.ws.common.management.AbstractServerConfig] (MSC se
rvice thread 1-8) JBoss Web Services - Stack CXF Server 4.0.2.GA
22:39:52,135 INFO [org.apache.coyote.http11.Http11Protocol] (MSC service thread
1-4) Starting Coyote HTTP/1.1 on http--0_0_0_0_0_0_0_0-8080
22:39:52,526 INFO [org.jboss.as.remoting] (MSC service thread 1-1) JBAS017100: Listening on /0:0:0:0:0:0:0:0:4447
22:39:52,526 INFO [org.jboss.as.remoting] (MSC service thread 1-5) JBAS017100:
Listening on /0:0:0:0:0:0:0:0:9999
22:39:52,526 INFO [org.jboss.as.server.deployment.scanner] (MSC service thread
1-8) JBAS015012: Started FileSystemDeploymentService for directory K:\jboss-as-7
.1.1.Final\standalone\deployments
22:39:52,838 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service
thread 1-8) JBAS010400: Bound data source [java:jboss/datasources/ExampleDS]
22:39:53,073 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin con sole listening on http://[0:0:0:0:0:0:0:0]:9990
22:39:53,073 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: JBoss AS
7.1.1.Final "Brontes" started in 6079ms - Started 133 of 209 services (75 servic
es are passive or on-demand)
p.s. 如有错误还恳请大神们批评指正,非常感谢!