第四部分:将状态数据添加到ToasterService实现(JMX Access)-数我的面包!
用于内部统计和故障排除,我们想要去跟踪在规定时间内烤面包机做了多少片面包。我们需要一个属性,toasts-made,是用来去跟踪计数和获得计数的一种方法。每当我们make-toast,我们想增加toasts-made。此外,我们想要一个机制去清理toasts-made的数量。为做到这一点 ,MDSAL提供了能够定义内部状态数据和RPC调用的功能,这些功能只能通过JMX完成。
1.1 定义状态数据模型
我们将在the toaster provider服务实现中定义toasts-made统计状态数据,因为这是在 make-toast发生的。此外我们还将定义一个RPC调用:clear-toasts-made。
在toaster-provider-impl.yang中:
1. import rpc-context { prefix rpcx; revision-date 2013-06-17; }
1. ...
2. augment "/config:modules/config:module/config:state" {
3. case toaster-provider-impl {
4. when "/config:modules/config:module/config:type = 'toaster-provider-impl'";
5.
6. leaf toasts-made {
7. type uint32;
8. }
9.
10. rpcx:rpc-context-instance "clear-toasts-made-rpc";
11. }
12. }
13.
14. identity clear-toasts-made-rpc;
15.
16. rpc clear-toasts-made {
17. description
18. "JMX call to clear the toasts-made counter.";
19.
20. input {
21. uses rpcx:rpc-context-ref {
22. refine context-instance {
23. rpcx:rpc-context-instance clear-toasts-made-rpc;
24. }
25. }
26. }
27. }
modules/module/state结构的扩大,choice-type节点添加模式节点特定于toaster-provider-impl模块身份类型(就像“when”的条款所表示的一样)。这就是我们定义的状态信息, MD-SAL通过JMX将可用到。
toasts-made是一个简单的叶节点。clear-toasts-made的定义应简单解释一下。我们为RPC定义了一个身份,clear-toasts-made-rpc,所以它可以被引用。RPC的input重用rpc-context-ref分组和继承context-instance叶节点,引用clear-toasts-made-rpc身份。同样的,我们在状态增加子句中定义了一个结点,同样也可以引用clear-toasts-made-rpc标志。通过这种方式,我们将状态数据节点绑定给RPC。
运行以下代码来生成资源。
1. mvn clean install
三个附加类在src/main/yang-gen-config目录下生成:
l ToasterProviderRuntimeMXBean—JMX bean接口,定义了getToastsMade()方法去为toasts-made属性和clearToastsMade() RPC方法提供查询。
l ToasterProviderRuntimeRegistration —具体类,包装一个ToasterProviderRuntimeMXBean注册。
l ToasterProviderRuntimeRegistrator —具体类,和MDSAL一起注册一个ToasterProviderRuntimeMXBean实现。
1.2 实现状态数据模型
既然我们已经为我们的状态数据和行为定义了数据模型,我们需要为他们提供一个实现。既然OpenDaylightToaster要烤面包,我们将会实现它。
ToasterProviderRuntimeMXBean为访问状态数据提供接口,所以我们要去修改OpenDaylightToaster来实现ToasterProviderRuntimeMXBean接口
1. public class OpendaylightToaster implements ToasterService, AutoCloseable, DataChangeListener, ToasterProviderRuntimeMXBean {
28. ...
29. private final AtomicLong toastsMade = new AtomicLong(0);
30. ...
31. /**
32. * Accessor method implemented from the ToasterProviderRuntimeMXBean interface.
33. */
34. @Override
35. public Long getToastsMade() {
36. return toastsMade.get();
37. }
38. /**
39. * JMX RPC call implemented from the ToasterProviderRuntimeMXBean interface.
40. */
41. @Override
42. public void clearToastsMade() {
43. LOG.info( "clearToastsMade" );
44. toastsMade.set( 0 );
45. }
46. ...
47.
48.
49. private class MakeToastTask implements Callable<Void> {
50. ...
51. @Override
52. public Void call() throws InterruptedException {
53. ...
54. toastsMade.incrementAndGet();
55. ...
56. }
57. }
58. }
1.3 注册ToasterProviderRuntimeMXBean服务
我们需要做注册OpendaylightToaster的最后一步。在ToasterProviderModule中我们这样做通过基类的getRootRuntimeBeanRegistratorWrapper()方法返回ToasterProviderRuntimeRegistrator来完成。
1. public java.lang.AutoCloseable createInstance() {
59. final OpendaylightToaster opendaylightToaster = new OpendaylightToaster();
60. ...
61. // Register runtimeBean for toaster statistics via JMX
62. final ToasterProviderRuntimeRegistration runtimeReg = getRootRuntimeBeanRegistratorWrapper().register( opendaylightToaster);
63. ...
64. final class AutoCloseableToaster implements AutoCloseable {
65. @Override
66. public void close() throws Exception {
67. ...
68. runtimeReg.close();
69. ...
70. }
71. ...
72. }
73. }
注意:当OpendaylightToaster实例关闭时,我们还必须关闭ToasterProviderRuntimeRegistration 。
1.4 通过JMX访问toasts-made和clear-toasts-made
我们可以通过MBeans由java management beans来添加toasts-made属性。你可以通过mbean平台或通过JConsole以编程的方式来访问这些。
l JConsole是每个JDK附带的实用程序,位于java主文件夹的bin目录。
l 首先,使用-jmx命令,启动控制器。
1. ./run.sh -jmx
这个命令在控制器中运行JMX服务,允许JConsole在JDK中运行。
运行JConsole,在jconsole应用下有两个按钮。
1. $JAVA_HOME/bin/jconsole
注意:路径可能会由于OS和初始化被修改。
l 通过选择应用程序连接到运行的eclipse进程,或者在远程连接对话框中指定"hostname:1088"端口。关于JMX看看这个文档的更多信息:https://wiki.opendaylight.org/images/8/89/Jconsole.pdf
l 一旦连接,导航到“mbean”选项卡。
l 扩展org.opendaylight.controller->RuntimeBean->toaster-provider-impl->toster-provider-impl结点。
l 选择"Attributes"。现在你将会看到,您将看到显示的“ToastsMade”属性,当执行make-toast RPC call时这个属性将会被更改。
l 在你多次调用ToastsMade call之后,刷新属性并且会看到的值增加。
l 现在选择Operations,并且点击clearToastsMade按钮。
l 返回Attributes,请注意,此时计数器被设置为0.