这是一篇简短的博客文章,介绍使用Java RMI时应注意的两个常见陷阱。

设置java.rmi.server.hostname

如果您感到陌生,Connection拒绝托管: RMI客户端上的错误消息,并且您确定连接应该正常工作(您仔细检查了所有标准配置,例如网络配置等)。RMI系统属性java.rmi.server.hostname值得研究。

要在远程对象上调用方法,RMI客户端首先必须从RMI注册表中检索远程存根对象。 此存根对象包含服务器地址,该服务器地址稍后将在调用远程方法时用于连接到远程对象(与RMI注册表的连接和与远程对象的连接是两个完全不同的东西)。 默认情况下,服务器将尝试检测自己的地址并将其传递给存根对象。 不幸的是,用于检测服务器地址的算法并不总是产生有用的结果(取决于网络配置)。

通过设置RMI服务器上的系统属性java.rmi.server.hostname,可以覆盖传递给存根对象的服务器地址。

这可以用Java代码完成

System.setProperty("java.rmi.server.hostname", "<<rmi server ip>>");

或添加Java命令行参数:

-Djava.rmi.server.hostname=<<rmi server ip>>

设置RMI服务端口

如果在通过防火墙进行RMI调用时遇到问题,则应确保为远程对象设置了特定的端口。 默认情况下,RMI注册表使用端口1099,因此请确保在防火墙中打开了此端口。 但是,此端口仅由客户端用于连接到RMI注册表,而不用于存根和远程对象之间的通信。 对于以后的版本,默认情况下使用随机端口。 由于您不想打开防火墙中的所有端口,因此应为RMI远程对象设置特定的端口。

这可以通过重写RMISocketFactory的createServerSocket()方法来完成:

public class MyRMISocketFactory extends RMISocketFactory {private static final int PREFERED_PORT = 1234;public ServerSocket createServerSocket(int port) throws IOException {if (port == 0) {return new ServerSocket(PREFERED_PORT);}return super.createServerSocket(port);}
}

默认情况下,如果将0作为参数传递,则createServerSocket()选择一个空闲的随机端口。 在createServerSocket()的此修改版本中,将0作为参数传递时,将返回特定端口(1234)。

如果您使用的是Spring的RmiServiceExporter,则可以使用setServicePort()方法在特定端口上导出服务:

<bean class="org.springframework.remoting.rmi.RmiServiceExporter"><property name="servicePort" value="1234"/>...
</bean>

请注意,多个远程对象/服务可以共享同一端口。 设置特定端口后,只需在防火墙中打开此端口。

参考: mscharhag编程和Stuff博客中的JCG合作伙伴 Michael Scharhag 使用Java RMI时要记住两点 。

翻译自: https://www.javacodegeeks.com/2013/11/two-things-to-remember-when-using-java-rmi.html

使用Java RMI时要记住的两件事相关推荐

  1. java rmi 使用管道_使用Java RMI时要记住的两件事

    java rmi 使用管道 这是一篇简短的博客文章,介绍使用Java RMI时应注意的两个常见陷阱. 设置java.rmi.server.hostname 如果您感到陌生,Connection拒绝托管 ...

  2. 编程程序的名称要记住吗_学习编程时要记住的5件事

    编程程序的名称要记住吗 by Kurt 由库尔特 学习编程时要记住的5件事 (5 Things to Remember When You're Learning to Program) Learnin ...

  3. 作为程序员,要取得非凡成就需要记住的15件事。

    作为程序员,要取得非凡成就需要记住的15件事. 1.走一条不一样的路 在有利于自己的市场中竞争,如果你满足于"泯然众人矣",那恐怕就得跟那些低工资国家的程序员们同场竞技了. 2.了 ...

  4. java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)

    java日志,需要知道的几件事 如果对于commons-loging .log4j .slf4j .LogBack 等都已经非常清楚了,可以忽略本文.几次解决日志冲突问题时对这几个概念的简单总结,希望 ...

  5. 初入职场两件事 入对行,跟对人---Leo读 不是孙振耀写的职场感言 6

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 版权声明 ...

  6. 有效管理要做的两件事:向上管理和向下负责

    从众多职场协作经验来看,我们必须认识到,人们高效合作是因为相互信任,他们拥有相似的道德价值观,遵循相同的道德默契,这种基于认同形成的信任才是组织内外协同的关键.有效管理需要做两件事:一件事是向上管理, ...

  7. 一生只为两件事,他的名字曾是中国高级机密!

    制图:中核集团 他是革命先烈彭湃之子 近60年都在与核动力打交道 他身上有着很多"第一" 我国第一任核潜艇总设计师 我国第一个核动力装置的主要设计者 第一座核电站的主要技术负责人 ...

  8. 今年努力在做的两件事

    点击上方"AI算法与图像处理",选择加"星标"或"置顶"重磅干货,第一时间送达 大家好,今天给大家分享自己今年努力在做的两件事!希望能对大家 ...

  9. 阿西莫夫:编造幻想与使之跟事实融为一体是两件事

    来源:返朴 撰文 | 尹传红 人类是孤独的吗? 20世纪70年代末,美国科普巨匠和科幻小说大师艾萨克·阿西莫夫(1920-1992),在他的一篇漫谈生与死的科学随笔中,写下了这样一段话:"依 ...

最新文章

  1. 设计模式学习笔记(八:迭代器模式)
  2. 扩展CXF, 支持LoadBalance负载均衡
  3. linux实现自动互信,Linux 使用shell脚本实现自动SSH互信功能
  4. MyBatis-Plus_更新操作
  5. centos中 npm install 被kill的解决方案
  6. Intel笔记本低压版CPU性能对比分析
  7. Cameralink协议
  8. C语言课设家庭财务小管家(大作业)
  9. 用计算机抽样,利用计算机代替随机数骰子进行随机抽样
  10. ROS 教程1 机器人操作系统 基础知识 节点 话题 消息 服务 行动 参数 日志 TF变换 目标结构 启动文件
  11. 【 开源计划 - Flutter组件 】 星星也可以如此闪耀 flutter_star
  12. [案例分享]金融大数据:三大应用场景提升营销收益 (二)
  13. 艾尔塔7号/Elta7
  14. java ee web pdf_Java EE Web高级开发案例 PDF扫描版[69MB]
  15. 6:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转
  16. 根据收入计算纳税和税后所得
  17. GPRS手机+笔记本电脑无线上网
  18. 中国废弃资源市场现状趋势与发展方向分析报告2022-2027年
  19. SI 539 网站开发(二):week6
  20. PEP代码规范简单总结

热门文章

  1. 字段缺失_区分Protobuf 3中缺失值和默认值
  2. nbiot开发需要掌握什么_学习软件开发需要准备什么?
  3. 优先队列——斐波那契堆(without source code)
  4. payara 创建 集群_Apache Payara:让我们加密
  5. envoy api 网关_在边缘,作为网关或在网格中构建控制平面以管理Envoy代理的指南...
  6. java8 函数式编程_如何使用Java 8函数式编程生成字母序列
  7. java iterable_太糟糕了,Java 8没有Iterable.stream()
  8. spring 类型转换器_Spring中的类型转换
  9. Java的@Serial批注
  10. spring 事件模型_Spring–设计领域模型和服务层