`
sshzhangwg
  • 浏览: 70811 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

使用Java RMI访问xmemcached暴露的JMX服务

 
阅读更多

  我们可以通过JMX监控xmemcached状态,xmemcached使用RMI暴露服务接口:


service:jmx:rmi:///jndi/rmi://ip:7077/xmemcachedServer



  xmemcached提供的MBean包括:

MBean 描述
net.rubyeye.xmemcached.monitor.StatisticsHandlerMBean 用于查看Client统计信息
net.rubyeye.xmemcached.impl.OptimizerMBean 用于调整性能参数
net.rubyeye.xmemcached.XMemcachedClientMBean 动态添加或者删除节点,查看有效服务器等信息


 下面我们一起来看一下具体如何来查看和使用java来调用上述服务。

        1) 首先下载memcachead程序,windows系统下面我们使用memcached.exe,附件提供了memcached-1.2.6-win32-bin。把它解压到硬盘的一个目录中,例如:C:\memcached-1.2.6-win32-bin。


        2) 在 http://code.google.com/p/xmemcached/downloads/list 下载xmemcached-1.3.5-bin-with-dependencies.tar.gz ,在将xmemcached导入到eclipse中。


        3) 在导入的工程里面,编写测试代码:


package net.rubyeye.xmemcached.example;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.exception.MemcachedException;
import net.rubyeye.xmemcached.utils.AddrUtil;

/**
 * 启动参数
 *  -Dxmemcached.jmx.enable=true -Dxmemcached.rmi.port=7077 -Dxmemcached.rmi.name=xmemcachedServer 
 *  -Dxmemcached.statistics.enable=true
 * @author Administrator
 */
public class BaseExample {

	public static void main(String[] args) throws IOException {
		// 构造builder
		MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:11211"));
		MemcachedClient memcachedClient = null;
		try {
			// 获取客户端连接对象
			memcachedClient = builder.build();

			// set 键为hello的数据
			memcachedClient.set("hello", 0, "Hello,xmemcached");
			String value = memcachedClient.get("hello");
			System.out.println("hello=" + value);
			memcachedClient.delete("hello");
			value = memcachedClient.get("hello");
			System.out.println("hello=" + value);
		} catch (MemcachedException e) {
			System.err.println("MemcachedClient operation fail");
			e.printStackTrace();
		} catch (TimeoutException e) {
			System.err.println("MemcachedClient operation timeout");
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}



 

 注意需要设置这个类的启动时的JVM参数,内容为:-Dxmemcached.jmx.enable=true -Dxmemcached.rmi.port=7077 -Dxmemcached.rmi.name=xmemcachedServer -Dxmemcached.statistics.enable=true,如下图:

http://my.iteye.com/admin/picture/107450

(可能是RP问题,这里显示不了图片,需要看图的同学情打开上面的URL,看图)


运行该类后,可以通过jconsole去连xmemcached暴露的jmx服务,如下图:


http://my.iteye.com/admin/picture/107452
http://my.iteye.com/admin/picture/107450

(可能是RP问题,这里显示不了图片,需要看图的同学情打开上面的URL,看图)


     4) 使用java程序,通过rmi访问这些MBean,程序如下:


package net.rubyeye.xmemcached.example;

import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import net.rubyeye.xmemcached.XMemcachedClientMBean;

public class RMITest {

	public static void main(String[] args) throws Exception {
		 JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:7077/xmemcachedServer");     		 
		 JMXConnector jmxc = JMXConnectorFactory.connect(url, null);     
		 MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
		 
		 // 依赖接口的调用方式
		 ObjectName namingName = ObjectName.getInstance("net.rubyeye.xmemcached:type=XMemcachedClient-MemcachedClient-0");
		 XMemcachedClientMBean proxy = (XMemcachedClientMBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, namingName, XMemcachedClientMBean.class, false);
		 System.out.println(proxy.getServersDescription());
		 System.out.println(proxy.getName());
	}
}



 执行结果:

[127.0.0.1:11211(weight=1)]
MemcachedClient-0


需要指出的是:

ObjectName.getInstance("net.rubyeye.xmemcached:type=XMemcachedClient-MemcachedClient-0");

这行代码的getInstance函数的参数,它是ObjectName的字面量,大家可以在上面的图中找到,对源码感兴趣的同学可以在xmemcached的源码中找到:

		LedacachedMbeanServer.getInstance().registMBean(
				this,
				this.getClass().getPackage().getName() + ":type="
						+ this.getClass().getSimpleName() + "-"
						+ MemcachedClientNameHolder.getName());


 就知道是怎么会事情了。


其他几个接口大家自己可以试验下,有什么心得体会写出来一起交流ING。



分享到:
评论

相关推荐

    使用RMI远程连接JVM.用JMX获取JVM的参数

    "Hello.java"和"HelloWorld.java"可能是示例类,用于演示RMI和JMX的使用。它们可能包含了简单的远程方法,或者展示了如何创建和注册MBean。 为了实现远程连接JVM并获取JVM参数,首先需要在服务器端启动JMX服务,并...

    xmemcached1.3.5源码-附带自己写的RMI调用它的JMX服务

    xmemcached1.3.5源码-附带自己写的RMI调用它的JMX服务,使用RMI调用JMX服务的详细过程,完整的eclipse工程,直接导入即可用。还用一些运行截图,很有用。 自己写的例子,类名是BaseExample 和RMITest.

    jmx三种访问方式

    1. **远程JMX连接**:Java默认使用Remote Method Invocation (RMI) 协议来实现远程JMX连接。通过设置`-Dcom.sun.management.jmxremote.rmi.port`和`-Dcom.sun.management.jmxremote.port`等参数,可以启用RMI服务,...

    javaRMI反序列化漏洞验证工具

    1. **环境准备**:确保Java环境和必要的库已安装,并了解目标RMI服务的地址和端口。 2. **运行工具**:使用命令行运行`attackRMI.jar`,并指定目标RMI服务器的相关参数。 3. **分析结果**:根据工具返回的信息,判断...

    java RMI技术实现的网络聊天室

    在本案例中,“java RMI技术实现的网络聊天室”是一个使用RMI构建的多用户交互系统,可以让用户通过网络进行实时通信。以下是对这个项目的关键知识点的详细解释: 1. **RMI概念**:RMI是一种基于对象的远程调用机制...

    基于JAVA RMI的聊天室

    **基于JAVA RMI的聊天室** Java Remote Method Invocation(RMI)是Java平台提供的一种用于在分布式环境中调用远程对象的方法。在这个“基于JAVA RMI的聊天室”项目中,开发者利用RMI技术构建了一个简单的多用户...

    java rmi java rmi

    根据提供的文件信息,我们可以深入探讨Java RMI(Java Remote Method Invocation)的相关知识点,包括其概念、原理、体系结构以及一个具体的示例。 ### RMI的概念 RMI是一种Java技术,它允许开发者创建分布式应用...

    java_rmi.rar_RMI java_java.rmi

    - **安全性**:RMI可以通过SSL/TLS加密通信,并且可以使用Java的安全管理器来控制访问权限。 - **动态导出和导入**:服务器可以在运行时动态地导出或导入远程对象,提供更大的灵活性。 学习和理解Java RMI对于开发...

    java RMI实现代码

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行远程对象的调用。RMI使得开发者可以像调用本地对象一样调用网络上的对象,极大地简化了...

    JavaRMI快速入门

    6. **RMISecurityManager**:为了确保安全,RMI应用通常会使用`RMISecurityManager`,它提供了对远程调用的访问控制和权限管理。 7. **异常处理**:`RemoteException`是RMI中最常见的异常,它通常表示在调用远程...

    javaRMI完整版.pdf

    4. 便于编写和使用:RMI 使得 Java 远程服务程序和访问这些服务程序的 Java 客户程序的编写工作变得轻松、简单。 5. 可连接现有 / 原有的系统:RMI 可通过 Java 的本机方法接口 JNI 与现有系统进行交互。 6. 分布式...

    java rmi 参考文档

    ### Java RMI (Remote Method Invocation) 概念与实践 #### 一、Java RMI简介 Java RMI(Remote Method Invocation)是一种允许调用不同Java虚拟机(JVM)上方法的机制。这些JVM可能位于不同的机器上,也可能在同一...

    通过Java RMI实现远程调用的一个简单例子

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种用于分布式计算的技术,它允许一个Java对象调用另一个在不同JVM上的对象的方法。这个简单的例子将引导我们了解如何利用Java RMI实现远程...

    JMX以RMI方式连接的场景示例

    在本场景中,我们将介绍如何使用RMI(Remote Method Invocation)连接方式来实现JMX框架的各层级的连接。 MBean是JMX框架的基本组件,用于提供管理信息和功能。MBean可以是任何Java对象,只要它实现了相关的接口。...

    JAVA RMI 传输 SSL加密

    Java RMI (Remote Method Invocation) 是一...总之,通过Java RMI结合SSL/TLS加密,我们可以创建一个安全的远程管理环境,确保JMX等服务的数据交换不受威胁。正确配置SSL参数和管理证书是保证这种通信方式安全的关键。

    JavaRMI超棒书

    Java RMI提供了一种简单的面向对象的方式来访问远程对象上的方法,从而简化了分布式程序的开发过程。 #### 二、Java RMI的关键特性 1. **序列化**:Java RMI依赖于Java序列化机制来处理远程对象的传递。序列化是将...

    JAVA RMI简单例子

    值得注意的是,RMI的安全性是通过Java的访问控制机制和SSL/TLS加密来保证的。默认情况下,RMI使用匿名连接,但在生产环境中,通常需要配置安全策略以限制远程调用的权限。 此外,RMI还可以与EJB(Enterprise ...

    JavaRMI.pdf

    - JRMP(Java Remote Message Protocol):这是Java RMI的原始实现,它使用Java特有的协议进行通信。 - RMI-IIOP(RMI over IIOP):RMI与CORBA(Common Object Request Broker Architecture)的结合,允许RMI系统与...

    java rmi HelloWorld版(源码)

    5. **导出远程对象**:使用`java.rmi.server.UnicastRemoteObject.exportObject()`方法导出远程对象,使其可以被网络访问。 6. **获取远程对象引用**:在客户端,使用`java.rmi.Naming.lookup()`方法根据名称从RMI...

    java RMI简单Demo

    Java RMI的使用有助于构建可扩展、模块化的分布式系统,但需要注意的是,它并不适合所有场景,特别是在高并发和大流量的情况下,可能需要考虑其他更高效的通信机制,如RMI的替代品如Java的JMS(Java Message Service...

Global site tag (gtag.js) - Google Analytics