JBOSS
的JMX
应用
...
2
1
访问JMX
的安全性设置
...
2
2
关闭JBOSS
的自动发布功能
...
2
2.1
修改server/default/conf/jboss-service.xml
热发布问题
...
2
3 JMX
网站的发布、停用、重发布、判断是否发
操作
...
3
3.1
本地调用JMX
..
4
3.1.1 deploy
操作
...
4
3.1.2 unDeploy
操作
...
5
3.1.3 isDeployed
操作
...
5
3.1.4 reDeploy
操作
...
6
3.2
通过JNDI
远程调用
...
6
3.2.1
配置jndi.properties
文件
...
7
3.2.2 deploy
操作
...
7
3.2.3 unDeploy
操作
...
7
3.2.4 isDeployed
操作
...
8
3.2.5 reDeploy
操作
...
9
JBOSS
的JMX
应用
主要讨论用
JBOSS
如何管理网站的发布,停用操作。其中关闭
JBOSS
的自动发布功能是为服务器的性能考滤,设置
JMX
的安全性是为了操作的安全。不影响网站的发布等操作。代码实例在
src
文件夹中。
1 访问JMX
的安全性设置
1.1Jmx-console安全控制
Jboss的jmx-console默认是不使用安全验证,这对于运行时的服务器是非常不安全。
在实际应用中往往需要打开其验证功能:
首先,C:/jboss-4.0.4.GA/server/default/deploy/jmx-console.war/WEB-INF/jboss-web.xml 中的java:/jaas/jmx-console取消注释。
然后,将C:/jboss-4.0.4.GA/server/default/deploy/jmx-console.war/WEB-INF/ web.xml 中的
HtmlAdaptor
An example security config that only allows users with the
role JBossAdmin to access the HTML JMX console web application
/*
GET
POST
JBossAdmin
取消注释。
再访问jmx-conlose时需要提供用户名admin,密码admin.
用户所属于的权限组可以在C:/jboss-4.0.4.GA/server/default/conf/props/ jmx-console-roles.properties 和jmx-console-users.properties 中更改。
1.2 JMX Connection的安全设置
参考:
http://wiki.jboss.org/wiki/Wiki.jsp?page=SecureTheInvokers
取消注释 server/xxx/deploy/jmx-invoker-service.xml中的.
<
descriptors
>
<
interceptors
>
<
interceptor
code
="
org.jboss.jmx.connector.invoker.AuthenticationInterceptor
"
securityDomain
="
java:/jaas/jmx-console
"/>
interceptors
>
descriptors
>
后使用jmx连接时需要使用安全验证了.
使用JMX时远程连接需要在初始化InitialContext 时设置用户名和密码,并且使用
org.jboss.security.jndi.JndiLoginInitialContextFactory 实现安全登陆.
详细如下:
Properties env = new Properties();
env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.security.jndi.JndiLoginInitialContextFactory");
env.setProperty(Context.PROVIDER_URL, "jnp://localhost:1099/");
env.setProperty(Context.SECURITY_PRINCIPAL, "username");
env.setProperty(Context.SECURITY_CREDENTIALS, "password");
InitialContext ctx = new InitialContext(env);
本地连接如何进行安全验证还没有找到.
2 关闭JBOSS
的自动发布功能
1
)
JBoss
热发布时如果更改
application.xml
文件时,服务器将重新加载
ear
中的所有资源,这个过程服务器会有一段时间中止响应。在应用中我们只需要加载改到的
war
就可以,
需要关闭热发布的功能。
2
)服务器在执行发布时
undeploy
和
deploy
时,并不会更改
application.xml
文件
,
需要手工去更改
application
文件。
2.1 修改server/default/conf/jboss-service.xml
热发布问题
JBOSS
在默认情况下自动发布所配置目录下的资源文件。在数商应用中需要关闭这一种功。
关闭这个功能时将会解决热发布的问题,在更改
xml
后,不会自动装载进去
如果更改
ear
中的
application.xml
时将会引起整个
ear
包的资源重新加载。
方法:
1).
在
conf/jboss-service.xml
中在
>
修改
<
attribute
name
="ScanEnabled">
trueattribute>
为
<
attribute
name
="ScanEnabled">
falseattribute>
.
重新启动JBOSS
3 JMX
网站的发布、停用、重发布、判断是否发
操作
JBOSS
支持远程和本地两种调用
JMX
Mbeans
的方法,主要区别在于取得
JMX
服务器的方法不同。远程使用时需要配置
jndi.properties
文件。
JMX网站的发布、停用、重发布、判断是否发 操作主要由
org.jboss.deployment.MainDeployerMBean类完成。主要方法有:
+void addDeployer(org.jboss.deployment.SubDeployer jboss.system:service=MainDeployer)
+ void removeDeployer(org.jboss.deployment.SubDeployer jboss.system:service=MainDeployer)
+ void deploy(java.lang.String jboss.system:service=MainDeployer)
+ void deploy(java.net.URL jboss.system:service=MainDeployer)
+ void deploy(org.jboss.deployment.DeploymentInfo jboss.system:service=MainDeployer)
+ void start(java.lang.String jboss.system:service=MainDeployer)
+ void stop(java.lang.String jboss.system:service=MainDeployer)
+ org.jboss.deployment.DeploymentInfo getDeployment(java.net.URL jboss.system:service=MainDeployer)
+ java.net.URL getWatchUrl(java.net.URL jboss.system:service=MainDeployer)
+ boolean isDeployed(java.net.URL jboss.system:service=MainDeployer)
+ boolean isDeployed(java.lang.String jboss.system:service=MainDeployer)
+ java.util.Collection listDeployed()
+ java.lang.String listDeployedAsString()
+ java.util.Collection listDeployedModules()
+ java.util.Collection listDeployers()
+ void checkIncompleteDeployments()
+ java.util.Collection listIncompletelyDeployed()
+ java.util.Collection listWaitingForDeployer()
+ void redeploy(java.lang.String jboss.system:service=MainDeployer)
+ void redeploy(java.net.URL jboss.system:service=MainDeployer)
+ void redeploy(org.jboss.deployment.DeploymentInfo jboss.system:service=MainDeployer)
+ void shutdown()
+ void undeploy(java.lang.String jboss.system:service=MainDeployer)
+ void undeploy(java.net.URL jboss.system:service=MainDeployer)
+ void undeploy(org.jboss.deployment.DeploymentInfo jboss.system:service=MainDeployer)
+ void create()
+ void start()
+ void stop()
+ void destroy()
+ void jbossInternalLifecycle(java.lang.String jboss.system:service=MainDeployer)
3.1 本地调用JMX
3.1.1 deploy
操作
//
得到
JMX
服务器对象
MBeanServer server = MBeanServerLocator.locateJBoss();
//
创建
ObjectName
对象
ObjectName name = org.jboss.deployment.MainDeployerMBean.OBJECT_NAME;
// Invoke the list(boolean) op
String[] sig = {"java.lang.String"};
Object[] opArgs = { "file:/C:/jboss-4.0.4.GA/server/default/deploy/newEbiz1.ear/jianshe.war/" };
try{
Object result = server.invoke(name,"deploy", opArgs, sig);
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (MBeanException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
}
3.1.2 unDeploy
操作
//
得到
JMX
服务器对象
MBeanServer server = MBeanServerLocator.locateJBoss();
//
创建
ObjectName
对象
ObjectName name = org.jboss.deployment.MainDeployerMBean.OBJECT_NAME;
// Invoke the list(boolean) op
String[] sig = {"java.lang.String"};
Object[] opArgs = { "file:/C:/jboss-4.0.4.GA/server/default/deploy/newEbiz1.ear/jianshe.war/" };
try{
Object result = server.invoke(name,"undeploy", opArgs, sig);
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (MBeanException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
}
3.1.3 isDeployed
操作
//
得到
JMX
服务器对象
MBeanServer server = MBeanServerLocator.locateJBoss();
//
创建
ObjectName
对象
ObjectName name = org.jboss.deployment.MainDeployerMBean.OBJECT_NAME;
// Invoke the list(boolean) op
String[] sig = {"java.lang.String"};
Object[] opArgs = { "file:/C:/jboss-4.0.4.GA/server/default/deploy/newEbiz1.ear/jianshe.war/" };
try{
Object result = server.invoke(name,"
isDeployed
", opArgs, sig);
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (MBeanException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
}
3.1.4 reDeploy
操作
//
得到
JMX
服务器对象
MBeanServer server = MBeanServerLocator.locateJBoss();
//
创建
ObjectName
对象
ObjectName name = org.jboss.deployment.MainDeployerMBean.OBJECT_NAME;
// Invoke the list(boolean) op
String[] sig = {"java.lang.String"};
Object[] opArgs = { "file:/C:/jboss-4.0.4.GA/server/default/deploy/newEbiz1.ear/jianshe.war/" };
try{
Object result = server.invoke(name,"
reDeploy
", opArgs, sig);
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (MBeanException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
}
3.2 通过JNDI
远程调用
1.
需要
jar
文件
2
.jndi.properties
需要放在环境变量中。
3.2.1 配置jndi.properties
文件
### JBossNS properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
3.2.2 deploy
操作
//
创建远程
JMX
服务器连接环境,并得到
JMX
服务器
InitialContext ic = new InitialContext();
RMIAdaptor server = (RMIAdaptor) ic.lookup("jmx/rmi/RMIAdaptor");
//
创建
ObjectName
对象
ObjectName name = org.jboss.deployment.MainDeployerMBean.OBJECT_NAME;
// Invoke the list(boolean) op
String[] sig = {"java.lang.String"};
Object[] opArgs = { "file:/C:/jboss-4.0.4.GA/server/default/deploy/newEbiz1.ear/jianshe.war/" };
try{
Object result = server.invoke(name,"deploy", opArgs, sig);
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (MBeanException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
}
3.2.3 unDeploy
操作
//
创建远程
JMX
服务器连接环境,并得到
JMX
服务器
InitialContext ic = new InitialContext();
RMIAdaptor server = (RMIAdaptor) ic.lookup("jmx/rmi/RMIAdaptor");
//
创建
ObjectName
对象
ObjectName name = org.jboss.deployment.MainDeployerMBean.OBJECT_NAME;
// Invoke the list(boolean) op
String[] sig = {"java.lang.String"};
Object[] opArgs = { "file:/C:/jboss-4.0.4.GA/server/default/deploy/newEbiz1.ear/jianshe.war/" };
try{
Object result = server.invoke(name,"
unDeploy
", opArgs, sig);
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (MBeanException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
}
3.2.4 isDeployed
操作
//
创建远程
JMX
服务器连接环境,并得到
JMX
服务器
InitialContext ic = new InitialContext();
RMIAdaptor server = (RMIAdaptor) ic.lookup("jmx/rmi/RMIAdaptor");
//
创建
ObjectName
对象
ObjectName name = org.jboss.deployment.MainDeployerMBean.OBJECT_NAME;
// Invoke the list(boolean) op
String[] sig = {"java.lang.String"};
Object[] opArgs = { "file:/C:/jboss-4.0.4.GA/server/default/deploy/newEbiz1.ear/jianshe.war/" };
try{
Object result = server.invoke(name,"
isDeployed
", opArgs, sig);
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (MBeanException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
}
3.2.5 reDeploy
操作
//
创建远程
JMX
服务器连接环境,并得到
JMX
服务器
InitialContext ic = new InitialContext();
RMIAdaptor server = (RMIAdaptor) ic.lookup("jmx/rmi/RMIAdaptor");
//
创建
ObjectName
对象
ObjectName name = org.jboss.deployment.MainDeployerMBean.OBJECT_NAME;
// Invoke the list(boolean) op
String[] sig = {"java.lang.String"};
Object[] opArgs = { "file:/C:/jboss-4.0.4.GA/server/default/deploy/newEbiz1.ear/jianshe.war/" };
try{
Object result = server.invoke(name,"
reDeploy
", opArgs, sig);
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (MBeanException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
}