「java.rmi.」javarminaming

博主:adminadmin 2022-12-08 21:18:08 54

本篇文章给大家谈谈java.rmi.,以及javarminaming对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java RMI调用远程程序抛出异常

背景要求:定时监控远程主机上mongodb数据库内存使用的情况,当内存使用过大时暂停逻辑处理线程后启动内存空间的释放处理线程,释放完成后再启动逻辑处理线程。

操作系统:CentOS 64bit (Linux)

步骤(代码省略):

1.创建Socket远程服务器

2.创建客户端

配置:

#查找对象stub端口

RMI_PORT=9902

#服务端口

RMI_SERV_RMI_PORT=9903

#注册服务地址端口要和查找对象stub端口一致

RMI_URL=rmi://192.168.0.118:9902/MongoServer

#绑定IP

RMI_IP=192.168.0.118

#检查内存shell

RMI_MEMQUERY_COMMAND=sh /home/test/BI/smartshow14/MongoDBRMIServer/memquery.sh

#释放内存shell

RMI_MEMFREE_COMMAND=sh /home/test/BI/smartshow14/MongoDBRMIServer/memclear.sh

#释放内存容量阀值,单位M

RMI_MEM_CAPACITY_LIMIT=3000

3.启动服务器

客户端线程通过 rmi://192.168.0.118:9902/MongoServer 访问时出现异常:

--定时扫描MONGODB内存线程--:开始运行!

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:

java.lang.ClassNotFoundException: com.linkage.iface.IMongoDBScan (no security manager: RMI class loader disabled)

at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)

at java.rmi.Naming.lookup(Naming.java:84)

at com.linkage.querytool.QueryRMICaller.ramCapacityScan(QueryRMICaller.java:87)

at com.linkage.querytool.MongoDBARMScanThread$TimerWorkTask.run(MongoDBARMScanThread.java:94)

at java.util.TimerThread.mainLoop(Timer.java:512)

at java.util.TimerThread.run(Timer.java:462)

Caused by: java.lang.ClassNotFoundException: com.linkage.iface.IMongoDBScan (no security manager: RMI class loader disabled)

at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:535)

at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)

at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)

at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)

at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1530)

at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1492)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)

... 6 more

--定时扫描MONGODB内存线程--:处理结束!

=======================================================================================================

--定时扫描MONGODB内存线程--:开始运行!

java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.0.118:9902 connect,resolve)

at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

at java.security.AccessController.checkPermission(AccessController.java:546)

at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)

at java.net.Socket.connect(Socket.java:524)

at java.net.Socket.connect(Socket.java:478)

at java.net.Socket.init(Socket.java:375)

at java.net.Socket.init(Socket.java:189)

at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)

at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)

at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)

at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)

at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)

at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)

at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)

at java.rmi.Naming.lookup(Naming.java:84)

at com.linkage.querytool.QueryRMICaller.ramCapacityScan(QueryRMICaller.java:89)

at com.linkage.querytool.MongoDBARMScanThread$TimerWorkTask.run(MongoDBARMScanThread.java:94)

at java.util.TimerThread.mainLoop(Timer.java:512)

at java.util.TimerThread.run(Timer.java:462)

--定时扫描MONGODB内存线程--:处理结束!

============================================================================================================

--定时扫描MONGODB内存线程--:开始运行!

java.security.AccessControlException: access denied (java.lang.RuntimePermission createSecurityManager)

at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)

at java.security.AccessController.checkPermission(AccessController.java:546)

at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

at java.lang.SecurityManager.init(SecurityManager.java:282)

at java.rmi.RMISecurityManager.init(RMISecurityManager.java:45)

at com.linkage.querytool.QueryRMICaller.ramCapacityScan(QueryRMICaller.java:88)

at com.linkage.querytool.MongoDBARMScanThread$TimerWorkTask.run(MongoDBARMScanThread.java:94)

at java.util.TimerThread.mainLoop(Timer.java:512)

at java.util.TimerThread.run(Timer.java:462)

--定时扫描MONGODB内存线程--:处理结束!

==========================================================================================================

以上异常都有可能出现,通过以下方式可解除问题:

1.在客户端程序前打开安全管理器:

try {

System.setSecurityManager(new java.rmi.RMISecurityManager());

mds = (IMongoDBScan) Naming.lookup(urlStr);

} catch (MalformedURLException e) {

//..........

}

2.修改/usr/java/jdk1.6.0_21/jre/lib/security/java.policy后重启

grant {

permission java.security.AllPermission;

}

JAVA RMI无法远程调用

java.lang.ClassNotFoundException: server.SayHello (no security manager: RMI class loader disabled)

缺少jar包,异常显示是缺少server.SayHello这个方法,确认新项目中是不是少了jar包。

java.rmi.Naming和java.rmi.registry.LocateRegistry的区别

区别如下:

1. Naming类只是在“远程对象注册表”上进行存储和读取操作,该类并不能创建“远程对象注册表”;

2. LocateRegistry类可以获取“远程对象注册表”引用,或者创建本地主机上的“远程对象注册表”;

3. Naming类方法封装了Registry接口方法,只需要一个URL就能对“远程对象注册表”进行相关操作,比如:

4. LocateRegistry类获取到Registry对象引用后,通过Registry类方法对“远程对象注册表”进行相关操作

java.rmi.ConnectIOException: error during JRMP connection establishment;

估计是内存没有释放的原因,因为你提供的信息不详细,没法准确给出答案。

你可以在代码中加入输出当前内存清空的代码。

package test;

import java.lang.management.ManagementFactory;

import com.sun.management.OperatingSystemMXBean;

public class OSTest {

public static void main(String[] args)

{

OperatingSystemMXBean osmb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();

System.out.println("系统物理内存总计:" + osmb.getTotalPhysicalMemorySize() / 1024/1024 + "MB");

System.out.println("系统物理可用内存总计:" + osmb.getFreePhysicalMemorySize() / 1024/1024 + "MB"); }

}

java RMI是什么意思啊?

RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。调用这样一个对象时,其参数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的参数为 "unmarshalled")上。该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。如果方法调用导致抛出异常,则该异常将指示给调用方。

java RMI问题

rmiregistry的默认端口是1099....你这里指定的端口是3000

所以你在CMD中要这样 start rmiregistry 3000

或者将你的Naming.bind("/localhost:3000/getStudent", obj);

改为Naming.bind("rmi://localhost:1099/getStudent", obj);

额,突然发现你没有在前面加rmi前缀...不知道这个有关系没~~~~

额,查了下,不加rmi前缀也可以,加了rmi前缀后会如果你没有指定端口就会将obj注册到主机上监听1099端口的rmiregistry进程上去...

如果还出现错误就不知道了

关于java.rmi.和javarminaming的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-08,除非注明,否则均为首码项目网原创文章,转载请注明出处。