通过Jmx访问MBean的两种方式:本机和远程,代码示例如下:
//////////////////////////////////////begin/////////////////////////////////////////////////////
public class JmxInvocationClient {
private static String queueName = "CND_00_21_CC_C3_06_20_";
private String strHostAndPortOfJmxUrl = "localhost:1099";
private String strJmxUrl = null;
private String strMbeanName = null;
private static boolean enableDebug = false;
private static String strJmxUrlFromSystem = null;
private static final String LOCAL_BROKER_NAME = "LOCAL_BROKER_NAME";
private static final String LOCAL_JMX_URL = "LOCAL_JMX_URL";
private static String jmxUser;
private static String jmxPassword;
private JMXServiceURL jmxServiceUrl;
private boolean jmxUseLocal = false;
private JMXConnector jmxConnector;
private MBeanServerConnection jmxConnection;
public static Log logger = LogFactory.getLog(JmxInvocationClient.class);
static {
enableDebug = Boolean.parseBoolean(System.getProperty("IS_DEBUG"));
strJmxUrlFromSystem = System.getProperty(LOCAL_JMX_URL);
queueName = queueName + System.getProperty(LOCAL_BROKER_NAME);
jmxUser = System.getProperty("emq.jmx.user");
jmxPassword = System.getProperty("emq.jmx.password");
}
public JmxInvocationClient() {
}
public JmxInvocationClient(final String paramHostAndPortOfJmxUrl) {
this.strHostAndPortOfJmxUrl = paramHostAndPortOfJmxUrl;
}
private void initParam() {
// 构造jmx url
StringBuffer sb = new StringBuffer(512);
sb.append("service:jmx:rmi:///jndi/rmi://");
sb.append(strHostAndPortOfJmxUrl);
sb.append("/jmxrmi");
this.strJmxUrl = sb.toString();
sb = null;
// 构造mbean的过滤名称
StringBuffer sbForMbean = new StringBuffer(512);
sbForMbean.append(",Type=Queue,Destination=");
sbForMbean.append(queueName);
this.strMbeanName = sbForMbean.toString();
sbForMbean = null;
}
private void initConn(final String paramJmxUrl) {
try {
this.jmxServiceUrl = new JMXServiceURL(paramJmxUrl);
} catch (MalformedURLException mue) {
mue.printStackTrace();
}
}
/**
* @return JMX service url
*/
private JMXServiceURL getJmxServiceUrl() {
return jmxServiceUrl;
}
/**
* Create a JMX connector
*
* @return created JMX connector
* @throws IOException
*/
private JMXConnector createJmxConnector() throws IOException {
// Reuse the previous connection
if (jmxConnector != null) {
jmxConnector.connect();
return jmxConnector;
}
// Create a new JMX connector
// Decide whether need security authentication or not
if (jmxUser != null && jmxPassword != null) {
Map<String, Object> props = new HashMap<String, Object>();
props.put(JMXConnector.CREDENTIALS, new String[] { jmxUser,
jmxPassword });
jmxConnector = JMXConnectorFactory.connect(this.getJmxServiceUrl(),
props);
} else {
jmxConnector = JMXConnectorFactory.connect(this.getJmxServiceUrl());
}
return jmxConnector;
}
/**
* Close the current JMX connector
*/
private void closeJmxConnection() {
try {
if (jmxConnector != null) {
jmxConnector.close();
jmxConnector = null;
}
} catch (IOException e) {
logger.error("An exception occurs when closing the JMX connector:");
e.printStackTrace();
}
}
/**
* Create a JMX connection
*/
private MBeanServerConnection createJmxConnection() throws IOException {
if (jmxConnection == null) {
if (isJmxUseLocal()) {
jmxConnection = ManagementFactory.getPlatformMBeanServer();
} else {
jmxConnection = createJmxConnector().getMBeanServerConnection();
}
}
return jmxConnection;
}
/**
* @param paramMsgId
* message id
* @return 0:no operate;1:success;2:failure;3:error;
*/
public int deleteMsgFromQueue(final String paramMsgId,
final boolean isJmxFromSystem) {
int flag = 0;
if (paramMsgId == null || paramMsgId.trim().length() == 0) {
return flag;
}
this.initParam();
this.initConn(isJmxFromSystem ? strJmxUrlFromSystem : this.strJmxUrl);
try {
this.createJmxConnection();
// 1.动态获取mbean的objectname
String strObjectName = "";
Iterator iter = this.jmxConnection.queryMBeans(null, null)
.iterator();
for (; iter != null && iter.hasNext();) {
ObjectInstance oi = (ObjectInstance) iter.next();
if (enableDebug) {
System.out.println("=Mbean ObjectName is:="
+ oi.getObjectName() + "=end=");
}
if (oi.getObjectName() != null
&& oi.getObjectName().toString().indexOf(
this.strMbeanName) >= 0) {
strObjectName = oi.getObjectName().toString();
break;
}
}
// 2.构造mbean对象
ObjectName mbeanName = new ObjectName(strObjectName);
// 3.得到proxy代理后直接调用的方式
QueueViewMBean proxy = (QueueViewMBean) MBeanServerInvocationHandler
.newProxyInstance(this.jmxConnection, mbeanName,
QueueViewMBean.class, false);
try {
if (proxy.removeMessage(paramMsgId)) {
flag = 1;
} else {
flag = 2;
}
} catch (Exception e) {
flag = 3;
// e.printStackTrace();
}
} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (MalformedObjectNameException mone) {
mone.printStackTrace();
}
this.closeJmxConnection();
return flag;
}
public static void main(String[] args) {
JmxInvocationClient test = new JmxInvocationClient();
if (false) {
String strMsgId = "111";
int result = test.deleteMsgFromQueue(strMsgId, false);
System.out.println("=result is:=" + result + "=end=");
}
}
public boolean isJmxUseLocal() {
return jmxUseLocal;
}
public void setJmxUseLocal(boolean jmxUseLocal) {
this.jmxUseLocal = jmxUseLocal;
}
}
//////////////////////////////////////end/////////////////////////////////////////////////////
分享到:
相关推荐
MBean主要分为两种类型:Standard MBean和Dynamic MBean。 ##### Standard MBean Standard MBean是最常见的MBean类型,它要求实现特定的接口,并遵循一定的命名约定。通常情况下,开发者只需要编写一个普通的...
5. **使用JConsole或VisualVM**:这两个内置的JMX客户端工具的使用方法,包括连接到远程MBean Server、查看和修改MBean属性、接收和处理通知。 6. **编写自定义管理工具**:介绍如何使用JMX API创建自己的管理工具...
在Java世界中,远程方法调用(Remote Method Invocation, RMI)和Java管理扩展(Java Management Extensions, JMX)是两个强大的工具,用于管理和监控分布式系统。本文将深入探讨如何利用RMI远程连接到Java虚拟机...
它提供了一种灵活的框架,允许开发者创建、注册和管理管理对象(MBeans),这些对象代表了系统中的可管理资源,并且可以通过JMX API进行访问和操作。 `jmxtools.jar` 和 `jmxri.jar` 是JMX技术中两个重要的库文件,...
创建MBean的方法有多种,主要包括动态注册MBean和静态注册MBean两种方式。动态注册是指在运行时通过代码动态地向MBean服务器注册一个MBean;而静态注册则是在启动时通过配置文件预先定义好的MBean。 ##### 3.2 ...
Java Management Extensions(JMX)是Java平台上的一个标准,它提供了一种管理和监控应用程序、操作系统、网络设备和其他Java应用程序的方式。这个"jmx-1.2.1(jmxri+jmxtools) jar"包含了JMX的两个核心组件:JMX ...
**JMX(Java Management Extensions)** 是Java平台提供的一种管理和监控的标准框架,它允许开发者对应用程序、设备和服务进行管理,提供了动态发现、监控和管理的能力。JMX 可以帮助我们远程控制应用,查看其运行...
- 连接和交互:通过JMX连接器,客户端可以连接到MBean服务器,并通过查询、调用操作或设置属性来管理MBean。 在实际应用中,JMX广泛应用于服务器管理工具、应用服务器、数据库管理系统以及其他需要远程监控和管理的...
它提供了一种统一的方式来创建、配置、查询和控制管理资源,使得开发者能够轻松地在他们的应用中添加管理功能。 `jmxri.jar` 和 `jmxremote.jar` 是与JMX相关的两个关键库文件: 1. **jmxri.jar**:这个库文件包含...
在IT领域,JMX(Java Management Extensions)和OSGi(Open Service Gateway Initiative)是两种重要的技术,它们分别用于管理和模块化Java应用程序。本实例将两者结合,展示了如何将OSGi的bundle注册到JMX以便进行...
在这个场景中,提到的两个jar文件——`jmx_remote-1_0_1_03-ri.zip`和`jmx-1_2_1-ri.zip`,都是与JMX相关的库,用于支持远程管理和监控。 1. `jmx-1_2_1-ri.zip`: 这个文件包含了JMX 1.2.1版本的Runtime ...
通过JMX,开发者可以轻松地在Java应用程序中集成管理和监控的功能,从而实现对应用程序状态和服务的远程管理。 在深入探讨JMX的具体用法之前,我们首先来了解它能够带来的实际益处: 1. **动态配置**:JMX允许应用...
通过上述示例可以看出,JMX通过定义MBean接口和其实现类的方式,使得我们能够通过标准的方法来管理和监控应用程序。这种方式不仅提高了应用程序的可管理性,同时也降低了管理操作的复杂度。 #### 六、总结 JMX作为...
2. **定义MBeans**:MBeans可以通过两种方式创建:使用标准的`@ManagedResource`注解标记Spring Bean,或者通过实现`MBean`接口。使用注解的方式更加便捷,因为它可以自动暴露属性和操作。 3. **注册MBeans**:...
在实际应用中,JMX常用于监控和管理Java应用程序的性能、配置或状态,例如,通过JConsole工具查看和调整应用程序的内存使用、线程状态,或者通过编程方式动态调整服务器配置。同时,JMX也是中间件和服务器产品(如...
JMX中有两种MBean类型:Standard MBean和Dynamic MBean。Standard MBean实现较为直接,适合开发阶段的项目;而Dynamic MBean则更加灵活,允许更精细的管理和监控能力,但实现相对复杂。 通过上述知识点的解析,我们...
MBean有两种类型:标准MBean和开放MBean。标准MBean用于表示具有固定属性和操作的简单对象,而开放MBean则提供了更灵活的数据类型支持。在J2SE 5.0及以后版本的JVM中,已经内置了一个平台MBean服务器,提供了一系列...
Java Management Extensions(JMX)是一种Java平台上的标准框架,用于管理和监控应用程序、系统和服务。它允许开发者创建可管理和监控的组件,称为MBeans,这些组件提供了对系统资源的访问和控制。以下是对JMX关键...
3. `jmxri.jar`和`jmxtools.jar`:这两个JAR文件是JMX RMI实现的核心库,分别包含了RMI服务器和客户端的实现,使得远程JMX交互成为可能。 4. `jmxri.properties`和`jmxtools.properties`:这些配置文件可能包含了...
JMS 支持两种消息模型: - **点对点(Point-to-Point)**:在这种模型中,消息由一个生产者发送到一个队列,然后由一个消费者接收。这种模式确保消息只被一个消费者接收,提供了一种可靠的单向通信方式。 - **发布...