在ColdFusion 9标准版中获取正在运行的请求列表

在ColdFusion 9标准版中获取正在运行的请求列表,coldfusion,coldfusion-9,Coldfusion,Coldfusion 9,有人知道在AdobeColdFusion 9标准版中是否有方法获取正在运行的请求列表吗?也许通过调用一个CF Java对象的方法,比如coldfusion.server.ServiceFactory 我知道在enterprise中,您可以使用服务器监视器进行此操作,但由于我们使用的是standard edition,因此没有可用的服务器监视器 谢谢。如果您只看了脚本名称,不介意做一些手工工作,您可以免费使用。您需要做的是启动堆栈跟踪。有几种方法可以做到这一点,但对我来说,它们是这样分解的: 以

有人知道在AdobeColdFusion 9标准版中是否有方法获取正在运行的请求列表吗?也许通过调用一个CF Java对象的方法,比如coldfusion.server.ServiceFactory

我知道在enterprise中,您可以使用服务器监视器进行此操作,但由于我们使用的是standard edition,因此没有可用的服务器监视器


谢谢。

如果您只看了脚本名称,不介意做一些手工工作,您可以免费使用。您需要做的是启动堆栈跟踪。有几种方法可以做到这一点,但对我来说,它们是这样分解的:

  • 以自己的身份运行ColdFusion(通过从命令行启动CF或将Windows服务更改为以自己的身份运行),然后使用获取堆栈转储

  • 让CF作为现有用户运行,但是,然后使用VisualVM连接并

  • 使用线程以编程方式获取线程列表。getAllStackTraces()。然后,您可以对数据执行任何操作。所有ColdFusion请求线程都启动web(对于内置web服务器)或JRP(对于通过IIS或apache处理的线程),因此您可以过滤掉其他类似的线程


如果您使用前两个选项来获取堆栈转储,那么我强烈建议使用来检查它们。您可以在10秒之外进行多次转储,并快速确定哪些请求是长期运行的

如果您只看到脚本名称,不介意做一点手动工作,您可以免费获得这些请求。您需要做的是启动堆栈跟踪。有几种方法可以做到这一点,但对我来说,它们是这样分解的:

  • 以自己的身份运行ColdFusion(通过从命令行启动CF或将Windows服务更改为以自己的身份运行),然后使用获取堆栈转储

  • 让CF作为现有用户运行,但是,然后使用VisualVM连接并

  • 使用线程以编程方式获取线程列表。getAllStackTraces()。然后,您可以对数据执行任何操作。所有ColdFusion请求线程都启动web(对于内置web服务器)或JRP(对于通过IIS或apache处理的线程),因此您可以过滤掉其他类似的线程


如果您使用前两个选项来获取堆栈转储,那么我强烈建议使用来检查它们。您可以每隔10秒进行几次转储,并快速确定哪些请求是长时间运行的

多亏了@barnyr的指导,我已经获得了一些代码,可以输出当前运行的脚本名称列表,这正是我所需要的。这是给感兴趣的人的

<!--- Create the thread object --->
<cfobject type="JAVA" action="Create" name="thread" class="java.lang.Thread">

<!--- Get all stack traces from the thread object --->
<cfset stackTrace = thread.getAllStackTraces()>

<!--- Convert the entrySet into an array --->
<cfset stackArray = stackTrace.entrySet().toArray()>

<cfoutput>
    <!--- Loop over the entrySet array --->
    <cfloop from="1" to="#ArrayLen(stackArray)#" index="sIndex">
        <!--- Get the current thread values --->
        <cfset thisThread = stackArray[sIndex].getValue()>
        <!--- Loop over current thread values --->
        <cfloop from="1" to="#ArrayLen(thisThread)#" index="tIndex">
            <!--- Get the filename for this thread --->
            <cfset thisThreadFile = thisThread[tIndex].getFileName()>
            <!--- If the file name contains .cfm output it --->
            <cfif isDefined("thisThreadFile") AND thisThreadFile CONTAINS ".cfm">
                #thisThreadFile#<br>
            </cfif>
        </cfloop>
    </cfloop>
</cfoutput>

#此线程文件#

多亏@barnyr的指导,我成功地获得了一些代码,这些代码将输出当前正在运行的脚本名称列表,这正是我所需要的。这是给感兴趣的人的

<!--- Create the thread object --->
<cfobject type="JAVA" action="Create" name="thread" class="java.lang.Thread">

<!--- Get all stack traces from the thread object --->
<cfset stackTrace = thread.getAllStackTraces()>

<!--- Convert the entrySet into an array --->
<cfset stackArray = stackTrace.entrySet().toArray()>

<cfoutput>
    <!--- Loop over the entrySet array --->
    <cfloop from="1" to="#ArrayLen(stackArray)#" index="sIndex">
        <!--- Get the current thread values --->
        <cfset thisThread = stackArray[sIndex].getValue()>
        <!--- Loop over current thread values --->
        <cfloop from="1" to="#ArrayLen(thisThread)#" index="tIndex">
            <!--- Get the filename for this thread --->
            <cfset thisThreadFile = thisThread[tIndex].getFileName()>
            <!--- If the file name contains .cfm output it --->
            <cfif isDefined("thisThreadFile") AND thisThreadFile CONTAINS ".cfm">
                #thisThreadFile#<br>
            </cfif>
        </cfloop>
    </cfloop>
</cfoutput>

#此线程文件#

试试cftracker,它可能会帮你找到你需要的东西

试试cftracker,它可能是你所需要的

谢谢特拉维斯。这是一个相当便宜的选择,但目前我只需要查看正在运行的脚本名称列表的单一功能。不过可能值199美元。谢谢特拉维斯。这是一个相当便宜的选择,但目前我只需要查看正在运行的脚本名称列表的单一功能。不过可能值199美元。谢谢你的建议,我已经尝试了第三种方法,但我不是一个Java程序员,我正在努力获得一些有意义的东西。我做到了:
,这似乎给了我一些输出,其中似乎包含线程ID,但与脚本无关。还有什么建议吗?谢谢你的建议,我已经尝试了第三种方法,但我不是一个Java程序员,我正在努力获得一些有意义的东西。我做到了:
,这似乎给了我一些输出,其中似乎包含线程ID,但与脚本无关。还有什么建议吗?答对了!我本打算在周一写一个例子,当时我手头有CF,但你抢先完成了。这差不多就是我写的。为了清晰起见,您可能需要在上面的输出中将每个线程与下一个线程分开。另外,如果显示线程的名称-ThistThread.getName(),则可以很容易地看到线程何时卡住或处于循环中,因为每次重新加载监控页面时,相同的线程名称将运行相同的代码。宾果!我本打算在周一写一个例子,当时我手头有CF,但你抢先完成了。这差不多就是我写的。为了清晰起见,您可能需要在上面的输出中将每个线程与下一个线程分开。此外,如果显示线程的名称-ThistThread.getName(),则可以很容易地看到线程何时卡住或处于循环中,因为每次重新加载监视页面时,相同的线程名称将运行相同的代码。