当前位置: 首页 > news >正文

用JMX管理你的web应用

这是来自TSS的一篇文章,以一个简单的例子说明如何在web应用中使用JMX管理你的组件。

http://www.theserverside.com/resources/article.jsp?l=JMXWebApps

一般我们使用jmx就是为了让你的资源(就是一些需要管理的bean)增加可管理性,将你需要管理的对象包装成Mbean,然后注册到MbeanServer中。我们的管理客户端通过Mbeanserver调用Mbean接口暴露的属性或操作,以达到动态管理组件的目的。大概看了一下这篇文章,简单分析一下关键在以下几点:

1。看下面Mbean实现 MyJspStats的代码 ,在构造器中通过weblogic的jndi服务得到MBeanServer并将自己注册到MBeanServer。它这里使用了weblogic服务器的Mbeanserver,这里你当然也可以创建自己的MBeanServer,将它放在Application中。
public class MyJspStats implements MyJspStatsMBean {

MBeanServer server = null; // MBeanServer

int starts = 0; // Number abandoned at start page
int selects = 0; // Number abandoned at selection
int confirms = 0; // Number abandoned before confirmation
int completions = 0; // Number of completed user Tx

Hashtable inStart = new Hashtable(); // Track user Tx started
Hashtable inSelect = new Hashtable(); // Track user Tx in select
Hashtable inConfirm = new Hashtable(); // Track user Tx in confirm

/** A no-argument constructor is necessary for Beans in JSPs **/
public MyJspStats() {
try {
Environment env = new Environment();
env.setProviderUrl("t3://localhost:7001");
env.setSecurityPrincipal("weblogic"); // username
env.setSecurityCredentials("weblogic"); // password
Context myCtx = env.getInitialContext();
MBeanHome mbeanHome =
(MBeanHome)myCtx.lookup("weblogic.management.home.localhome");
server = mbeanHome.getMBeanServer();

ObjectName objName =
new ObjectName(mbeanHome.getDomainName()+
":Name=MyJspStats,Type=MyJspStats");

// Register MBean so MBean can be accessed by remote managers
server.registerMBean(this, objName);

} catch (Exception ex) {
System.err.println("Cannot get MBeanServer: "+ex);
}
}
......

2。看下面在jsp中使用MyJspStats的代码,使用jsp的usebean标签在application范围内创建对象。
<jsp:useBean id="mbean" class="sample.MyJspStats" scope="application"/>

<%
mbean.updateTx(request.getSession(true), "START");
%>

<p><b>Start a Transaction</b><p>
<p><a HREF="page2.jsp">Transfer Money Between Accounts</a>
<p><a HREF="abortpage.jsp">Abort Transaction</a>

3。下面是管理页面,在管理页面上,如何取得Mbeanserver,以及调用Mbean的管理操作。
MBeanHome mbeanHome = (MBeanHome)myCtx.lookup("weblogic.management.home.localhome");
MBeanServer server = mbeanHome.getMBeanServer();
这里以同样的方式取得MBeanServer。
server.getAttribute(objName, "Completions")
这便是取得Mbean的属性了。


<%@ page import="
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.management.ObjectName;
import weblogic.jndi.Environment;
import weblogic.management.MBeanHome;
import javax.management.MBeanServer;
" %>

<h3>User Transaction Statistics</h3>

<table border="3"><tbody><tr>
<td><b>User Transaction Stage</b></td>
<td><b>Number of Transactions</b></td> </tr>
<%
Environment env = new Environment();
env.setProviderUrl("t3://localhost:7001");
env.setSecurityPrincipal("weblogic"); // username
env.setSecurityCredentials("weblogic"); // password
Context myCtx = new InitialContext();
MBeanHome mbeanHome = (MBeanHome)myCtx.lookup("weblogic.management.home.localhome");
MBeanServer server = mbeanHome.getMBeanServer();

ObjectName objName = new ObjectName(mbeanHome.getDomainName()+":Name=MyJspStats,Type=MyJspStats");

out.print("<tr><td>Completions</td><td>"
+server.getAttribute(objName, "Completions")+"</td></tr>");
out.print("<tr><td>Abandonded at Confirm</td><td>"
+server.getAttribute(objName, "Confirms")+"</td></tr>");
out.print("<tr><td>Abandonded at Select</td><td>"
+server.getAttribute(objName, "Selects")+"</td></tr>");
out.print("<tr><td>Abandonded at Start</td><td>"
+server.getAttribute(objName, "Starts")+"</td></tr>");
%>
</tbody></table>

总结例子的用法,由于在Web应用中,本身就有现成的Web服务,可以直接取得Mbeanserver,通过简单的jsp来访问。如果是在应用程序中,要通过web方式管理,就需要使用Http适配器了,同样也可以使用Rmi适配器使之可以通过远程调用的方式管理,只要将适配器同时注册到Mbeanserver中就可以了。
<iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4465827781731051&amp;dt=1125637635921&amp;format=468x60_as&amp;output=html&amp;ad_type=text_image&amp;nloc=http://blog.csdn.net/fckeditor/editor/fckeditor.html?InstanceName=Editor_Edit_FCKEditor&amp;Toolbar=Default&amp;u_h=768&amp;u_w=1024&amp;u_ah=740&amp;u_aw=1024&amp;u_cd=16&amp;u_tz=540&amp;u_his=9&amp;u_java=true" frameborder="0" width="468" scrolling="no" height="60" allowtransparency="65535"></iframe>

相关文章:

  • 高级人工智能.Modus Pones定理完备性证明(详细)
  • 高级人工智能.归结原理完备性证明(详细)
  • 年前的高中同学聚会
  • 力扣Leetcode:45. 跳跃游戏 II(Python)
  • JMX入门之StandardMBean HelloWord
  • 力扣Leetcode:1. 两数之和(C++、Python、Java)
  • 最长公共子序列
  • 国科大.图像处理.期末复习笔记手稿
  • 喝茶减少电脑对自身的伤害
  • 2020计算机专业保研夏令营面经:南科大计算机
  • 无耻的愤怒
  • 力扣Leetcode:2. 两数相加(C++、Python、Java)
  • 解决jsp程序不直接、代码与UI混杂的痛: JSPWidget
  • Python TypeError: unsupported operand type(s) for /: ‘list‘ and ‘int‘
  • Hello,.NET Compact Framework 2.0(二)
  • ECMAScript6(0):ES6简明参考手册
  • jQuery(一)
  • Linux链接文件
  • Next.js之基础概念(二)
  • React-Native - 收藏集 - 掘金
  • Sublime Text 2/3 绑定Eclipse快捷键
  • tensorflow学习笔记3——MNIST应用篇
  • 搭建gitbook 和 访问权限认证
  • 官方解决所有 npm 全局安装权限问题
  • 前端临床手札——文件上传
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用Gradle第一次构建Java程序
  • 学习HTTP相关知识笔记
  • 在Unity中实现一个简单的消息管理器
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​用户画像从0到100的构建思路
  • #1015 : KMP算法
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $.ajax,axios,fetch三种ajax请求的区别
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (4)事件处理——(7)简单事件(Simple events)
  • (Ruby)Ubuntu12.04安装Rails环境
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (强烈推荐)移动端音视频从零到上手(上)
  • (一一四)第九章编程练习
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .gitignore文件_Git:.gitignore
  • .net 简单实现MD5
  • .net 设置默认首页
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net(C#)中String.Format如何使用
  • .sh
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [android] 天气app布局练习
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [C/C++随笔] char与unsigned char区别
  • [c++] 单例模式 + cyberrt TimingWheel 单例分析
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [DevOps云实践] 彻底删除AWS云资源