Почему ColdFusion вылетает / перезапускается каждый раз, когда вызывается определенный шаблон?

Я поддерживаю сайт ColdFusion 8, работающий на Windows Server 2003 R2 (со всеми установленными обновлениями безопасности Windows). Сайт работает бесперебойно в 99,9% случаев. Однако около 2 месяцев назад служба сервера приложений ColdFusion 8 начала выходить из строя и перезапускаться каждую ночь в 22:30. Существует запланированное задание ColdFusion, которое выполняется каждую ночь в 22:30, поэтому я попытался запустить его вручную (прямой URL-адрес в браузере), и, конечно же, служба сервера приложений ColdFusion 8 аварийно завершилась и перезапустилась. Так что, очевидно, именно этот шаблон и вызывает это.

Этот шаблон выполняет чтение каталога, заполненного файлами PDF, а затем просматривает эти файлы, создавая несколько миниатюрных изображений для каждого с использованием CFPDF. Эта запланированная задача выполнялась годами без этой проблемы. Служба CF, по-видимому, аварийно завершает работу / перезапускается почти сразу перед обработкой одного файла

Я попытался запустить тот же шаблон в нашей промежуточной среде, и он работал нормально - перезапуск CF не выполнялся. Я очень смущен.

Просматривал журналы ColdFusion и ничего не нашел.

ОБНОВИТЬ:

Пример кода:

<cffunction name="createThumbnails" returntype="Void" output="false">
    <cfargument name="sourcePath" type="String" default="" />
    <cfargument name="overwriteExisting" type="Boolean" default="true" />
    <cfargument name="deleteSourceFile" type="Boolean" default="false" />

    <cfset var _image = {} />

    <cfif FileExists(ARGUMENTS.sourcePath)>
        <cfif   ARGUMENTS.overwriteExisting
            OR  NOT FileExists(getXLargeThumbnailPath())>
            <!---   Large Image for MACXpress --->
            <cfset _image =
                REQUEST.UDFLib.Image.scale(
                    imagePath = ARGUMENTS.sourcePath,
                    maxHeight = 777,
                    maxWidth = 627
                    ) />

            <cfimage
                action="write"
                source="#_image#"
                overwrite="true"
                destination="#getXLargeThumbnailPath()#" />
        </cfif>

        <cfif   ARGUMENTS.overwriteExisting
            OR  NOT FileExists(getXLargeThumbnailPath())>
            <cfset _image =
                REQUEST.UDFLib.Image.scale(
                    imagePath = ARGUMENTS.sourcePath,
                    maxHeight = 211,
                    maxWidth = 215
                    ) />

            <cfimage
                action="write"
                source="#_image#"
                overwrite="true"
                destination="#getXLargeThumbnailPath()#" />
        </cfif>

        <cfif   ARGUMENTS.overwriteExisting
            OR  NOT FileExists(getLargeThumbnailPath())>
            <cfset _image =
                REQUEST.UDFLib.Image.scale(
                    imagePath = ARGUMENTS.sourcePath,
                    maxHeight = 265,
                    maxWidth = 215
                    ) />

            <cfimage
                action="write"
                source="#_image#"
                overwrite="true"
                destination="#getLargeThumbnailPath()#" />
        </cfif>

        <cfif   ARGUMENTS.overwriteExisting
            OR  NOT FileExists(getMediumThumbnailPath())>
            <cfset _image =
                REQUEST.UDFLib.Image.scale(
                    imagePath = ARGUMENTS.sourcePath,
                    maxHeight = 100,
                    maxWidth = 100
                    ) />

            <cfimage
                action="write"
                source="#_image#"
                overwrite="true"
                destination="#getMediumThumbnailPath()#" />
        </cfif>

        <cfif   ARGUMENTS.overwriteExisting
            OR  NOT FileExists(getSmallThumbnailPath())>
            <cfset _image =
                REQUEST.UDFLib.Image.scale(
                    imagePath = ARGUMENTS.sourcePath,
                    maxHeight = 50,
                    maxWidth = 50
                    ) />

            <cfimage
                action="write"
                source="#_image#"
                overwrite="true"
                destination="#getSmallThumbnailPath()#" />
        </cfif>

        <cfscript>
            if  (ARGUMENTS.deleteSourceFile) {
                try {
                    FileDelete(ARGUMENTS.sourcePath);
                }
                catch (any e) {
                }
            }
        </cfscript>
    </cfif>
</cffunction>

REQUEST.UDFLib.PDF:

<cffunction
    name="pdfToImageFile"
    returntype="String"
    output="false"
    hint="Converts a phsyical PDF File to a physical Image file and returns the absolute path of the new Image file">
    <cfargument name="sourcePath" type="String" default="" />
    <cfargument name="destinationPath" type="String" default="" />
    <cfargument name="format" type="String" default="png" />

    <cfset var LOCAL = {} />

    <cfif NOT isValidPDF(Trim(ARGUMENTS.sourcePath))>
        <cfthrow
            message="Source file not specified or not a valid PDF file." />
    </cfif>

    <cfif NOT DirectoryExists(Trim(ARGUMENTS.destinationPath))>
        <cfthrow message="Inavlid Destination path." />
    </cfif>

    <cfif
        NOT ListFindNoCase(
                GetWriteableImageFormats(),
                Trim(ARGUMENTS.format)
                )>
        <cfthrow message="Inavlid Image format specified." />
    </cfif>

    <cfscript>
        LOCAL.DestinationFilePath =
                Trim(ARGUMENTS.destinationPath)
            &   "\"
            &   VARIABLES.Library.File.getFileNameWithoutExtension(
                    GetFileFromPath(ARGUMENTS.sourcePath)
                    )
            &   "."
            &   LCase(Trim(ARGUMENTS.format));

        LOCAL.RandomAccessFile =
            CreateObject("java", "java.io.RandomAccessFile")
                .init(
                    CreateObject("java","java.io.File")
                        .init(ARGUMENTS.sourcePath),
                    "r"
                    );

        LOCAL.FileChannel = LOCAL.RandomAccessFile.getChannel();
    </cfscript>

    <cftry>
        <cfset LOCAL.PDFFile =
            CreateObject("java", "com.sun.pdfview.PDFFile")
                .init(
                    LOCAL.FileChannel.map(
                        CreateObject("java", "java.nio.channels.FileChannel$MapMode")
                            .READ_ONLY,
                        0,
                        LOCAL.FileChannel.size()
                        )
                    ) />

        <cfset LOCAL.PDFPage = LOCAL.PDFFile.getPage(1) />

        <cfif NOT StructKeyExists(LOCAL, "PDFPage")>
            <cfthrow message="PDF cannot be converted - unknown error." />
        </cfif>

        <cfcatch type="Any">
            <cfscript>
                LOCAL.RandomAccessFile.close();
            </cfscript>

            <cfthrow message="PDF cannot be converted - unknown error." />
        </cfcatch>
    </cftry>

    <cfscript>
        //  Create new image
        LOCAL.Rectangle = LOCAL.PDFPage.getBBox();

        LOCAL.BufferedImage =
            CreateObject("java", "java.awt.image.BufferedImage")
                .init(
                    LOCAL.Rectangle.width,
                    LOCAL.Rectangle.height,
                    CreateObject("java", "java.awt.image.BufferedImage")
                        .TYPE_INT_RGB
                    );

        LOCAL.Graphics = LOCAL.BufferedImage.createGraphics();

        LOCAL.Graphics.drawImage(
            LOCAL.PDFPage.getImage(
                LOCAL.Rectangle.width,
                LOCAL.Rectangle.height,
                LOCAL.Rectangle,
                JavaCast("null", ""),
                true,
                true
                ),
            0,
            0,
            JavaCast("null", "")
            );

        LOCAL.Graphics.dispose();

        LOCAL.ImageFile =
            CreateObject("java", "java.io.File")
                .init(LOCAL.DestinationFilePath);

        //  Delete existing image file
        if  (LOCAL.ImageFile.exists())
            LOCAL.ImageFile.delete();

        //  Export the image to the specified format
        CreateObject("java", "javax.imageio.ImageIO")
            .write(
                LOCAL.BufferedImage,
                JavaCast("string", Trim(ARGUMENTS.format)),
                LOCAL.ImageFile
                );

        LOCAL.RandomAccessFile.close();

        return LOCAL.DestinationFilePath;
    </cfscript>
</cffunction>

REQUEST.UDFLib.Image:

<cffunction name="scale" returntype="Any" output="false">
    <cfargument name="imagePath" type="String" required="true" />
    <cfargument name="action" type="String" default="fit" hint="shrink, enlarge, or fit"/>
    <cfargument name="minWidth" type="Numeric" default="-1" />
    <cfargument name="minHeight" type="Numeric" default="-1" />
    <cfargument name="maxWidth" type="Numeric" default="-1" />
    <cfargument name="maxHeight" type="Numeric" default="-1" />

    <cfscript>
        var scaledDimensions = {
                width = -1,
                height = -1
            };
        var scaledImage = ImageNew();

        scaledImage = ImageNew(ARGUMENTS.imagePath);

        switch (ARGUMENTS.action) {
            case "shrink":
                scaledDimensions =
                    getDimensionsToShrink(
                        imageHeight = scaledImage.getHeight(),
                        imageWidth = scaledImage.getWidth(),
                        maxWidth = ARGUMENTS.maxWidth,
                        maxHeight = ARGUMENTS.maxHeight
                    );

                break;
            case "enlarge":
                scaledDimensions =
                    getDimensionsToEnlarge(
                        imageHeight = scaledImage.getHeight(),
                        imageWidth = scaledImage.getWidth(),
                        minWidth = ARGUMENTS.minWidth,
                        minHeight = ARGUMENTS.minHeight
                    );

                break;
            default:
                scaledDimensions =
                    getDimensionsToFit(
                        imageHeight = scaledImage.getHeight(),
                        imageWidth = scaledImage.getWidth(),
                        minWidth = ARGUMENTS.minWidth,
                        minHeight = ARGUMENTS.minHeight,
                        maxWidth = ARGUMENTS.maxWidth,
                        maxHeight = ARGUMENTS.maxHeight
                    );

                break;
        }

        if (scaledDimensions.width > 0 && scaledDimensions.height > 0) {
            // This helps the image quality
            ImageSetAntialiasing(scaledImage, "on");

            ImageScaleToFit(
                scaledImage,
                scaledDimensions.width,
                scaledDimensions.height
                );
        }

        return scaledImage;
    </cfscript>
</cffunction>

Спасибо @MarkAKruger за указание мне на файлы CFROOT\runtime\bin\hs_err_pid*.log. Это похоже на проблему с памятью при попытке конвертировать PDF в PNG....

Вот ссылка на содержимое файла с последнего раза, когда я пытался запустить этот шаблон (чтобы включить сюда большой):

Файл дампа ошибок

Я все еще очень ценю любую помощь, выясняющую, как исправить.....

1 ответ

Решение

Загляните в каталог /runtime/bin и посмотрите, есть ли у вас какие-либо файлы ошибок - что-то вроде hserrorxxxx.log (не вспомните формат для java 1.4). Это ошибка "горячей точки", обычно возникающая при сбое. Откройте один и посмотрите. Я предполагаю, что вам не хватает памяти, или в ваш PDF-файл встроено изображение RGB, которое закрывает ваш сервер. Вы можете выяснить это из стека в файле ошибок hs (hotspot).

Другие вопросы по тегам