Nano Hash - криптовалюты, майнинг, программирование

JasperReports: рендеринг подотчета

Я использую JasperReports с Spring MVC для создания отчетов в своем приложении. Обычно я сначала разрабатываю отчеты в iReport 4.1.1, а затем помещаю полученный файл .jasper в путь к своему классу через jasper-view.xml.

Когда приходит запрос, контроллер заносит нужные параметры из Session в Parameter Map и формирует отчет.

Сценарий: в моем основном отчете около 15 подотчетов. Из всех этих отчетов печатаются только те отчеты, которые соответствуют критериям (переданным в качестве параметров) (управляется параметром "Печатать когда" в группе)

И мой вопрос: если мой отчет не должен быть напечатан, выполняется ли он (т.е. запрос внутри него)? или это просто пропущено?

Причина, по которой я задаю этот вопрос, заключается в том, что создание отчета занимает довольно много времени (около 2 с, что, по моему мнению, слишком долго для моего приложения).

Спасибо.

14.02.2012

Ответы:


1

Если вы посмотрите на исходный код «Jasper Reports», логика говорит, что сначала оценивается «printWhenExpression», а затем заполняется элемент отчета, если он должен быть напечатан.

Ниже приведен метод под названием 'fillNoData' из JRVerticalFiller.java (версия 4.0), который говорит следующее:

private void fillNoData() throws JRException
    {
        if (log.isDebugEnabled() && !noData.isEmpty())
        {
            log.debug("Fill " + fillerId + ": noData");
        }

        noData.evaluatePrintWhenExpression(JRExpression.EVALUATION_DEFAULT);

        if (noData.isToPrint())
        {
            while (noData.getBreakHeight() > pageHeight - bottomMargin - offsetY)
            {
                addPage(false);
            }

            noData.evaluate(JRExpression.EVALUATION_DEFAULT);

            JRPrintBand printBand = noData.fill(pageHeight - bottomMargin - offsetY);

            if (noData.willOverflow() && noData.isSplitPrevented() && isSubreport())
            {
                resolveGroupBoundElements(JRExpression.EVALUATION_DEFAULT, false);
                resolveColumnBoundElements(JRExpression.EVALUATION_DEFAULT);
                resolvePageBoundElements(JRExpression.EVALUATION_DEFAULT);
                scriptlet.callBeforePageInit();
                calculator.initializeVariables(ResetTypeEnum.PAGE, IncrementTypeEnum.PAGE);
                scriptlet.callAfterPageInit();

                addPage(false);

                printBand = noData.refill(pageHeight - bottomMargin - offsetY);
            }

            fillBand(printBand);
            offsetY += printBand.getHeight();

            while (noData.willOverflow())
            {
                resolveGroupBoundElements(JRExpression.EVALUATION_DEFAULT, false);
                resolveColumnBoundElements(JRExpression.EVALUATION_DEFAULT);
                resolvePageBoundElements(JRExpression.EVALUATION_DEFAULT);
                scriptlet.callBeforePageInit();
                calculator.initializeVariables(ResetTypeEnum.PAGE, IncrementTypeEnum.PAGE);
                scriptlet.callAfterPageInit();

                addPage(false);

                printBand = noData.fill(pageHeight - bottomMargin - offsetY);

                fillBand(printBand);
                offsetY += printBand.getHeight();
            }

            resolveBandBoundElements(noData, JRExpression.EVALUATION_DEFAULT);
        }
    }

Что вам нужно изучить, так это то, как использование подотчетов влияет на производительность и использование памяти. Похоже, в основной отчет встроено слишком много подотчетов. Вот кое-что из этой ссылки на JasperForge:

Есть ли проблемы с производительностью подотчетов?

Ответ на этот вопрос зависит от вашей системы, источника данных и дизайна вашего отчета. Несколько замечаний по подотчетам:

  • Каждое выполнение подотчета может породить новый поток (см. ниже).
  • По мере выполнения подотчета в памяти кучи будет создаваться больше объектов.

На тему тредов. Добавлена ​​поддержка продолжений Java в качестве альтернативы потокам. Это было сделано с помощью библиотеки Javaflow Jakarta Commons. Свойство JasperReports: net.sf.jasperreports.subreport.runner.factory можно использовать со следующими двумя настройками:

  • net.sf.jasperreports.engine.fill.JRContinuationSubreportRunnerFactory
  • net.sf.jasperreports.engine.fill.JRThreadSubreportRunnerFactory

По умолчанию используется net.sf.jasperreports.engine.fill.JRThreadSubreportRunnerFactory, однако, если установлено значение net.sf.jasperreports.engine.fill.JRContinuationSubreportRunnerFactory, для заполнения отчетов будет использоваться подход Javaflow, а не потоки. Если выбран этот параметр, JAR-файл Jakarta Commons Javaflow должен быть включен в путь к классам приложения. Этот jar можно найти в каталоге lib дистрибутива проекта отчетов JasperReport. Файл jasperreports-javaflow.properties иллюстрирует, как это свойство может быть установлено в реальной реализации. Другими вариантами обработки разных запросов в одном и том же отчете являются использование элемента списка и поднаборов данных.

14.02.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..