Posted on 2006-07-27 13:10
Earth 阅读(253)
评论(0) 编辑 收藏 所属分类:
JavaEE5/EJB3
Different from EJB services, which are provided by a pool of managed objects, a JMX MBean service is provided by a singleton object in the server JVM. This service object is stateful and has an application-wide scope.
JMX MBean服务以单例的形式存在于JVM中,它是有状态并且存在于application范围内。
1,定义JMX服务接口
public
interface
Calculator {
//
Attribute
public
void
setGrowthrate (
double
g);
public
double
getGrowthrate ();
//
The management method
public
double
calculate (
int
start,
int
end,
double
saving);
//
Life cycle method
public
void
create ()
throws
Exception;
public
void
destroy ()
throws
Exception;
}
你可以实现下面任意的JMX生命周期方法:
create() --
start() --
stop() --
destroy() --
2,定义JMX服务实现
@Service (objectName
=
"
trail:service=calculator
"
)
@Management(Calculator.
class
)
public
class
CalculatorMBean
implements
Calculator {
double
growthrate;
public
void
setGrowthrate (
double
growthrate) {
this
.growthrate
=
growthrate;
}
public
double
getGrowthrate () {
return
growthrate;
}
public
double
calculate (
int
start,
int
end,
double
saving) {
double
tmp
=
Math.pow(
1
.
+
growthrate
/
12
.,
12
.
*
(end
-
start)
+
1
);
return
saving
*
12
.
*
(tmp
-
1
)
/
growthrate;
}
//
Lifecycle methods
public
void
create()
throws
Exception {
growthrate
=
0.08
;
System.out.println(
"
Calculator - Creating
"
);
}
public
void
destroy() {
System.out.println(
"
Calculator - Destroying
"
);
}
}
MBean的实现必须使用@Service标注,它用来告诉JBoss需要以objectName为命名将其注册为一个MBean Service,@Management表示服务接口,可以有多个, 你可以在JMX控制台(http://localhost:8080/jmx-console/) 通过trail:service=calculator找到这个服务
3,使用JMX MBean服务
calculator.jsp
<%
@ page
import
=
"
trail.jmx.*, org.jboss.mx.util.*,
java.text.
*
, javax.management.
*
"
%>
<%!
private
Calculator cal
=
null
;
public
void
jspInit () {
try
{
MBeanServer server
=
MBeanServerLocator.locate();
cal
=
(Calculator) MBeanProxyExt.create(
Calculator.
class
,
"
trail:service=calculator
"
,
server);
}
catch
(Exception e) {
e.printStackTrace ();
}
}
%>
<%
String result;
int
start
=
25
;
int
end
=
65
;
double
saving
=
300.0
;
try
{
start
=
Integer.parseInt(request.getParameter (
"
start
"
));
end
=
Integer.parseInt(request.getParameter (
"
end
"
));
saving
=
Double.parseDouble(request.getParameter (
"
saving
"
));
NumberFormat nf
=
NumberFormat.getInstance();
nf.setMaximumFractionDigits(
2
);
result
=
nf.format(cal.calculate(start, end, saving));
}
catch
(Exception e) {
e.printStackTrace ();
result
=
"
Not valid
"
;
}
%>
二、定义MBeans之间的依赖关系,
如同Ant中的任务一样,用@Depends标注就可以了
@Service (objectName
=
"
trail:service=investmentAdvisor
"
)
@Depends ({
"
trail:service=calculator
"
,
"
trail:service=riskAnalysis
"
})
public
class
InvestmentAdvisorMBean
implements
InvestmentAdvisor {
//
}
还有一种方法,使用依赖注入
@Service (objectName
=
"
trail:service=investmentAdvisor
"
)
public
class
InvestmentAdvisorMBean
implements
InvestmentAdvisor {
@Depends (
"
trail:service=calculator
"
)
public
void
setCalculator (Calculator calculator) {
this
.calculator
=
calculator;
}
//
}