使用Plotly Dash for Python的JBeans(JMX)监视 - python

我正在尝试使用破折号来实时监视JBeans属性。使用dcc.Interval时,在第一次POST / _dash-update-component尝试之后,程序会自动关闭。

Python 3.6
破折号1.0.2

我连接到Jconsole。引用Jbean属性并提取值是可行的。它甚至在我第一次启动dash应用程序时有效,但是随后触发Interval时,dash程序关闭。

经过JBean测试-正常运行
测试了Dash代码-提取n_intervals很好

脚步:

JMX功能模块

import jpype as jpype
from jpype import java
from jpype import javax
import sys, os
import pandas as pd
import datetime

#JMX CONNECTION FUNCTION:

def jmx_connect(HOST, USER, PORT, PASS):
    URL = 'service:jmx:rmi:///jndi/rmi://'+HOST+':'+PORT+'/jmxrmi'
    jpype.startJVM(jpype.get_default_jvm_path())
    jhash = java.util.HashMap()
    jarray=jpype.JArray(java.lang.String)([USER,PASS])
    jhash.put(javax.management.remote.JMXConnector.CREDENTIALS, jarray);
    jmxurl = javax.management.remote.JMXServiceURL(URL)
    jmxsoc = javax.management.remote.JMXConnectorFactory.connect(jmxurl,jhash)
    connection = jmxsoc.getMBeanServerConnection();
    return connection

#Enter login details HERE:
HOST = 
USER = 
PORT = 
PASS = 

#initializing connection with my login details
connection = jmx_connect(HOST, USER, PORT, PASS)


#Thread Count function to extract number of active threads:
#THREAD COUNT
def jmx_ThreadCount():
    object="java.lang:type=Threading"
    attribute= "ThreadCount"
    attr = connection.getAttribute(javax.management.ObjectName(object),attribute)
    return attr

短跑模块

from TEST_jvmRun import *  #this is import of my JVM functions
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objs as go

app = dash.Dash()

app.layout = html.Div([
    html.H1(id='live-update-text'),
    dcc.Interval(id='interval-component', interval=10000, n_intervals=0)
])

@app.callback(Output('live-update-text', 'children'),
              [Input('interval-component', 'n_intervals')])
def update_current_delay(n): 
    #return f"counter: {n}"
    return f"WORKING, trial: {n}  ; {jmx_ThreadCount()}" 

if __name__ == '__main__':
    app.run_server()

a)实际结果

---命令行输出:

C:\Users\m011472\Documents\Python Scripts\Web>cd "c:\Users\m011472\Documents\Python Scripts\Web" && cmd /C "set "PYTHONIOENCODING=UTF-8" && set "PYTHONUNBUFFERED=1" && C:\Python36\python.exe C:\Users\m011472\.vscode\extensions\ms-python.python-2018.4.0\pythonFiles\PythonTools\visualstudio_py_launcher.py "c:\Users\m011472\Documents\Python Scripts\Web" 53564 34806ad9-833a-4524-8cd6-18ca4aa74f14 RedirectOutput,RedirectOutput "c:\Users\m011472\Documents\Python Scripts\Web\TEST_dashboard.py" "
 * Serving Flask app "TEST_dashboard" (lazy loading) * Environment: production   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8050/ (Press CTRL+C to quit)
127.0.0.1 - - [28/Mar/2019 14:57:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [28/Mar/2019 14:57:03] "GET /_dash-layout HTTP/1.1" 200 -
127.0.0.1 - - [28/Mar/2019 14:57:03] "GET /_dash-dependencies HTTP/1.1" 200 -
127.0.0.1 - - [28/Mar/2019 14:57:03] "POST /_dash-update-component HTTP/1.1" 200 -

C:\Users\m011472\Documents\Python Scripts\Web>

---仪表盘输出:

工作,试用:0; 418

b)预期结果

---命令行输出:

程序应每10秒执行一次POST,并且永不结束

---仪表板输出:

编号应每10秒更新一次

工作,试用:0; XXX(任何数字)
工作,试用:1; XXY
工作,试用:2; XXZ

参考方案

如果有人感兴趣-我找到了部分解决方案。 dcc.Interval引起的问题,因为它在每个间隔创建一个新线程,并且JMX调用要求将JVM实例附加到当前线程。

添加了jpype.attachThreadToJVM()

def jmx_ThreadCount():
    print("State=", jpype.isThreadAttachedToJVM())
    if not jpype.isThreadAttachedToJVM():
        print ("Needs to attach...")
        jpype.attachThreadToJVM()
        print ("Check Attached=", jpype.isThreadAttachedToJVM())  
    object="java.lang:type=Threading"
    attribute= "ThreadCount"
    attr = connection.getAttribute(javax.management.ObjectName(object),attribute)
    return attr

现在的问题是:如何防止dcc.Interval在每个间隔创建新线程?

如何更改for循环的索引? - python

假设我有一个for循环:for i in range(1,10): if i is 5: i = 7 如果要满足特定条件,我想更改i。我试过了,但是没用。我该怎么办? 参考方案 对于您的特定示例,这将起作用:for i in range(1, 10): if i in (5, 6): continue 但是,最好使用while循环:i = 1 while i…

生成器表达式组合线理解执行步骤 - python

                                                                                                                    [print(x) for x in ((x ** 2) for x in range(5))] 输出0 1 4 9 16 [N…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:同时在for循环中添加到列表列表 - python

我想用for循环外的0索引值创建一个新列表,然后使用for循环添加到相同的列表。我的玩具示例是:import random data = ['t1', 't2', 't3'] masterlist = [['col1', 'animal1', 'an…

尝试在Spyder IPython控制台中初始化Dash时出错 - python

尝试使用Dash运行简单的仪表板时出现错误。我在Python 3.4中使用Spyder。我pip installed dash, dash_core_components, dash_html_compenents ..我的代码:import dash import dash_core_components as dcc import dash_html_c…