【问题标题】:ColdFusion / IIS / Redirect Limit?ColdFusion / IIS / 重定向限制?
【发布时间】:2018-07-09 16:43:30
【问题描述】:

我有一个 ColdFusion 脚本,它执行一项任务,然后使用 <cflocation> 标记重定向到自身,并传入下一个要处理的 ID。该脚本在正好 51 行后停止工作。我认为这是代码中的错误,所以我将要处理的 ID 更新为 52,它从 ID 52 运行到 102 并停止。同样,正好是 51 行。

有谁知道ColdFusion 中cflocation 标签是否有限制?或者这可能是 IIS 正在做的事情?

当我使用 JavaScript window.location 方法时,它可以正常工作并且直到最后才停止 - 正如预期的那样。

更新 - 说明

处理每个 ID 后脚本重定向到自身的原因是因为 ColdFusion 直到请求完成后才会将变量/内存释放回 JVM。因此,对于执行数百个复杂任务的请求,内存使用量会持续增长,直到请求正式完成。这会导致 JVM 中出现 ERROR OUT OF MEMORY。据我了解,纠正此问题的最佳方法是将项目拆分为单独的请求,这样 ColdFusion 会将请求变量/内存释放回 JVM。因此,为什么我们要处理 1 个项目,然后重定向到自我传递下一个要处理的 ID。这是为了让 ColdFusion 将请求视为唯一并降低内存消耗。

【问题讨论】:

  • 这听起来像是XY Problem。与其问如何解决您尝试的解决方案,不如告诉我们您通过多次重定向尝试解决的实际问题是什么?
  • @Miguel-F - 更新了我的问题以显示更多细节
  • 我假设通过传递您正在更新或以某种方式处理数据库中记录的 ID?为什么要在内存中存储这么多东西?你能在每次迭代中重复使用相同的结构吗?你不能删除每次迭代之间的结构吗?使用StructDelete() 的AFAIK 将破坏对这些变量的引用,从而释放GC 的内存空间。即使你通过了这个重定向限制,我猜你接下来会开始遇到请求超时问题。
  • 我同意@Miguel-F 的观点。这似乎是一项可以以更好的方式完成的大量工作。如果您的进程在内存不足的情况下运行 JVM,则该进程的工作方式可能存在问题。我还将研究 Leeish 提出的使用排队机制来处理这些记录的建议。但如果可以将这些过程批处理而不是循环它们,那就更好了。
  • 你在每次迭代中运行什么样的“数百个复杂任务”?

标签: iis coldfusion iis-8 coldfusion-10


【解决方案1】:

这是一个“丑陋的黑客”,但是,也许你想尝试一下,以防你找不到其他选择。

我可以通过从 ColdFusion 执行 curl 来测试和运行它,直到作为计划任务完成,因此它需要 curl 可用。


<cfparam name="url.id" default="0" />
<cfset url.id = url.id + 1 />


<!--- // your task code --->

<cffile 
    action = "append"
    file = "C:\inetpub\wwwroot\foo\redir-log.txt" 
    output = '#url.id#'>

<!--- // your task code --->


<!--- // condition to end the loop --->
<cfif (url.id lt 300)>

    <cfset args = [
        'http://127.0.0.1:53227/redir.cfm?id=#url.id#'
    ] />

    <cfexecute 
        name="curl" 
        arguments="#args#" 
        variable="output" 
        errorVariable="error" 
        timeout="0" 
    />

    <cfdump var="#output#" />
    <hr />

    <cfdump var="#error#" />
    <hr />

</cfif>

【讨论】:

    【解决方案2】:

    我不确定 ColdFusion/IIS 中是否存在限制,但我认为浏览器具有故障保护功能以限制无限循环。在我的浏览器(Chrome)中,似乎限制是 19。

    解决这个问题的方法是确保 HTML 加载,这样我们就不会混淆会话。然后使用以下任一方式进行重定向。

    1. window.location
    2. &lt;meta http-equiv="refresh" content="0;url=http://example.com"&gt;.

    【讨论】:

    • 关于如何从 CF 计划任务中重定向的任何建议?我正在尝试元标记(因为 JavaScript 不在计划任务中执行),但它什么也没做。
    • 如果您通过计划任务执行此操作,也许您最好使用队列。因此,创建一个计划任务,每 1 分钟重复一次或类似的事情,并在特定时间运行它。每次运行任务时,检查队列以查看队列中是否有更多记录。如果没有剩余,请将计划任务更新为直到第二天晚上才运行。我认为您可能会像 RRK 所说的那样达到重定向限制。
    • 按照@Leeish 所说的那样,如果您使用队列,则无需重定向即可将ID 传递给下一次运行。所以你可以让任务继续每 X 分钟运行一次。每次运行时,它都会从队列中获取下一个 ID 并开始工作。如果没有要处理的内容,它将退出并等待下一次计划运行。
    猜你喜欢
    • 2015-09-11
    • 2012-02-27
    • 2017-11-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2021-07-20
    • 2014-08-03
    相关资源
    最近更新 更多