首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodeJs和jmx (国家预防机制: jmx)

nodeJs和jmx (国家预防机制: jmx)
EN

Stack Overflow用户
提问于 2016-08-04 17:37:45
回答 1查看 1.7K关注 0票数 1

我在使用jmx包与来自nodeJs的Java应用程序进行桥接和通信时遇到了问题(参见https://www.npmjs.com/package/jmx)。我的代码是这样的:

代码语言:javascript
复制
var jmx = require('jmx');

var jmxTester = function(host, port) {
  var jmxrmi = 'service:jmx:rmi:///jndi/rmi://' + host + ':' + port + '/jmxrmi';
  winston.debug('jmxrmi is: ', jmxrmi);

  var client = jmx.createClient({
    service: jmxrmi
  });

  client.on('error', function (e) {
    winston.silly('Error: JMX at %s:%d', host, port, e);
    client.disconnect();
  });

  client.on('disconnect', function (err) {
    winston.silly('Successfully disconnected from client.');
  });

  client.on('connect', function() {
    winston.silly('Successfully connected to client.');
    client.disconnect();
  });

  client.connect();
}

module.exports = jmxTester;

将其与以下方面结合使用:

代码语言:javascript
复制
var jmxTester = require('jmxTester');

jmxTester('localhost', 20000);

遇到了几个问题,这与我在localhost:2000上运行一个jmx或者如果我没有运行任何东西这一事实无关。

  1. 无恶魔不能再重新启动节点了。它只是显示: 没有恶魔因为改变而重新开始。 但实际上并没有重新启动。似乎jmx留下了一些未处理的东西,一个资源处于打开状态,所以nodemon不能正确地关闭节点。
  2. 我还注意到,当直接与节点一起运行应用程序时,我必须发送杀死-9,而不是“正常”的杀死。如果删除jmxFun调用,一切都会正常运行。那么,jmx有什么问题呢?

有人能帮我找出如何正确使用nodeJs中的jmx吗?因此,我得到一个干净的连接和断开(在错误和没有任何错误)。

以下是一些样本输出:

  1. localhost:2000上运行JMX应用程序(之后进行两个文件更改,就不会重新启动): 2016-08-04T17:20:06.423Z -调试: jmxrmi是: service:jmx:rmi:///jndi/rmi://localhost:2000/jmxrmi 2016-08-04T17:20:06.433Z -愚蠢:成功连接到客户端。2016-08-04T17:20:06.434Z -愚蠢:成功从客户端断开连接。没有恶魔因为改变而重新开始。没有恶魔因为改变而重新开始。
  2. 如果没有在localhost:2000上运行JMX应用程序(之后执行两个文件更改,就不会重新启动): 2016-08-04T17:34:28.384Z -调试: jmxrmi是: service:jmx:rmi:///jndi/rmi://localhost:2000/jmxrmi 2016-08-04T17:34:28.390Z -愚蠢:错误: JMX在本地主机:2000{[错误:运行静态方法java.io.IOException:未能检索RMIServer存根: javax.naming.ServiceUnavailableException根异常是java.rmi.ConnectException:连接拒绝宿主: localhost;嵌套的例外是: javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:369) at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:270) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法处的java.net.ConnectException: sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498)引起: javax.naming.ServiceUnavailableException根异常是java.rmi.ConnectException:连接拒绝主机: localhost;嵌套的例外是:在com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:122) at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:205) at javax.naming.InitialContext.lookup(InitialContext.java:417) at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1955) at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1922)上拒绝连接在javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:287) .还有5.因为改变而重新开始..。没有恶魔因为改变而重新开始。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-05 20:23:30

我找到了解决我的问题的方法,这有两个原因,我很乐意与其他人分享这一页:

  1. 这个问题与节点jmx模块使用的节点java实现有关。我找不到任何解释,但这里有一个解决方案:https://github.com/remy/nodemon/issues/573。因此,我将以下内容添加到我的main.js中,以便在绑定到我的process.on之前,java被“使用”: var java =需要量(‘java’);java.import("javax.management.remote.JMXConnectorFactory");
  2. RMI超时应该减少,否则节点等待响应(由于节点-jmx的同步实现)。因此,你应该: System.setProperty('sun.rmi.transport.connectionTimeout',‘500’;System.setProperty('sun.rmi.transport.tcp.handshakeTimeout',‘500’;System.setProperty('sun.rmi.transport.tcp.responseTimeout','500');System.setProperty('sun.rmi.transport.tcp.readTimeout','500'); 首先,测试表明,对于某些超时时间,500的值可能有点过于乐观。因为我有时会超时,即使JMX是可用的(多亏了Java RMI - Client Timeout)

希望这能帮到别人!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38773982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档