为啥应该设置 com.sun.management.jmxremote.rmi.port?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥应该设置 com.sun.management.jmxremote.rmi.port?相关的知识,希望对你有一定的参考价值。

参考技术A

原文地址: https://alphahinex.github.io/2020/07/26/why-should-set-jmxremote-rmi-port/

description: "不设置貌似也没问题啊"
date: 2020.07.26 19:26
categories:
- Java
tags: [Java]
keywords: Java, JMX, RMI, Firewall

在使用 JMX 对 Java 应用进行监控时,一般会在启动时添加如下参数:

后三个参数在 Oracle 官方文档 Monitoring and Management Using JMX Technology 中均有描述,但前两个参数直到 JDK9 版本的文档 中才有所提及。

java.rmi.server.hostname 为需要远程连接时必须设置的参数,否则只能从本地对应用进行监控,无法从远程机器进行连接。

那么 com.sun.management.jmxremote.rmi.port 这个参数指定的端口是干什么用的呢?

按上面启动命令所示,使用 jmx 进行连接的时候使用的是 com.sun.management.jmxremote.port 参数指定的端口, com.sun.management.jmxremote.rmi.port 这个参数去掉好像也没什么影响,依然能够进行远程连接,那么为什么还要设置这个参数呢?

先来看一下 官方文档 中关于这个参数为数不多的描述:

大意为,使用 com.sun.management.jmxremote.port 指定端口后,除了在这个端口上会创建一个 RMI 连接器之外,还会额外创建另一个连接器,而这个额外创建的连接器的端口,就可以通过 com.sun.management.jmxremote.rmi.port 参数来指定。

这个额外连接器的端口,在我们进行监控的时候并没有使用到,而且不进行指定也会随机使用一个端口,那为什么还要指定呢?

让我们使用 docker 来模拟一个网络访问受限的环境,看一看这个参数的影响。

先准备一个用来监控的 Java 应用。比如可以从 https://github.com/AlphaHinex/spring-roll 通过 ./gradlew bootJar ,在 modules/roll-application/build/libs 路径获得一个 Spring Boot 的 Fat Jar。

然后在 Java 应用路径,创建一个 docker-compose.yml 文件,内容参考如下:

按照上述 docker-compose.yml 内容,执行 docker-compose up jmx ,之后使用 jvisualvm 、 jconsole 等工具,连接 9009 端口,会发现无法正常进行连接。

将 docker-compose.yml 调整为如下内容:

此时在通过 JMX 连接 9009 端口,会发现可以正常的进行监控了。

当存在防火墙等网络访问限制时,可通过 com.sun.management.jmxremote.rmi.port 参数指定 RMI 连接器所使用的端口并进行开放。 在这种场景下,必须设置此参数。

另外, com.sun.management.jmxremote.rmi.port 使用的端口,可以与 com.sun.management.jmxremote.port 指定的端口相同,这样仅开放一个端口就可以了,比如:

为啥我的列表项调用了它不应该调用的函数?

【中文标题】为啥我的列表项调用了它不应该调用的函数?【英文标题】:Why is my list item calling functions it should not?为什么我的列表项调用了它不应该调用的函数? 【发布时间】:2019-11-04 06:22:40 【问题描述】:

您好,我在 React Native 中为我的设置页面构建了一个列表组件。 我希望设置页面上的每个组件都有一个功能(在某些情况下没有)。

我创建了一个带有objectsarray,我在其中放置了每个项目属性。

 const list = [
            
              title: 'Change user settings',
              icon: 'account-circle',
              link: 'UserEdit',
              action: this.noFunction()
            ,
            
              title: 'Logout',
              icon: 'exit-to-app',
              link: 'Auth',
              action: this.sessionFunction()
            ,
        ]

现在我有两个列表项,每个项都有自己的函数应用于它们的action 属性。

当我在我的应用程序中按下一个 listItem 时,它会调用这两个函数。

但我只想应用与应用关联的功能。

我该怎么做?我的代码中是什么导致了这个错误?

      noFunction()
        console.log('noFunction')
      

      sessionFunction =() =>  
        console.log('sessionFunction')
        this.deleteSession().then(() => 
          this.props.destroySession();
        )
      

    render() 
        const list = [
            
              title: 'Change user settings',
              icon: 'account-circle',
              link: 'UserEdit',
              action: this.noFunction()
            ,
            
              title: 'Logout',
              icon: 'exit-to-app',
              link: 'Auth',
              action: this.sessionFunction()
            ,
        ]
        return (
            <View>
                
                    list.map((item, i) => (
                    <ListItem
                        key=i
                        title=item.title
                        leftIcon=
                             name: item.icon 
                        
                        onPress=() => 
                          item.action
                          this.props.navigation.navigate(item.link)
                          
                    />
                    ))
                
            </View>
            )
        

    

【问题讨论】:

action: this.sessionFunction() 立即执行该函数,它不会将其分配给action,而是将该函数的结果分配给@ 987654329@。由于sessionFunction 没有return 语句,因此它分配undefined 【参考方案1】:

只需从函数中删除 ()

当你有类似action: this.noFunction() 的东西时,你正在执行函数并将其分配给action,所以foo.action 将是从noFunction 调用返回的值(在你的情况下是未定义的,因为noFunction 没有' t返回任何东西)。

如果你像action: this.noFunction 一样传递它,你只传递对函数的引用,然后你可以做foo.action() 并调用noFunction

【讨论】:

这会导致noFunction 出错,我认为 - undefined is not a function 谢谢,这似乎有效。我确实需要将 () 添加到 item.action 回调中。让它看起来像 item.action()【参考方案2】:

您需要删除调用表达式()

【讨论】:

以上是关于为啥应该设置 com.sun.management.jmxremote.rmi.port?的主要内容,如果未能解决你的问题,请参考以下文章

如何用jmx监控tomcat 服务器

dokcer 中的jmx连接

在 java 9 中查询交换空间

java如何获取系统内存、cpu等信息。

React children 应该设置为啥 TypeScript 类型?

我应该在 NPM package.json 中将我的“启动”脚本设置为啥?