0

ソースコード:

public class ReportGenerator implements Serializable {

    private static final long serialVersionUID = -3995091296520157208L;
    @Inject
    private ReportCacheSession reportCacheSession;
    @Inject
    private UserSessionBean userSessionBean;
    @Inject
    private Instance<ReportBuilder> reportBuilderInstance;

    public static final int BUILD_ERROR = 0;
    public static final int BUILD_OK = 1;
    public static final int BUILD_NOPAGES = 2;

    private ReportBuilder reportBuilder = null;

    private FileData build(String jasperName, Map<String, Object> params, String extension, boolean guardarCache, boolean inline) {
        FileData fd = null;

        reportBuilder = reportBuilderInstance.get();
        if (reportBuilder != null) {
            reportBuilder.jasperName = jasperName;
            reportBuilder.emailName = SevUtils.getEmailName(userSessionBean.getUserInfo().getEmail());
            reportBuilder.sessionId = JSFUtils.getSessionId();
            reportBuilder.params = params;
            reportBuilder.extension = extension;
            //reportBuilder.config(jasperName, SevUtils.getEmailName(userSessionBean.getUserInfo().getEmail()), JSFUtils.getSessionId(), params, extension);
            reportBuilder.start();

            try {
                reportBuilder.join();
            } catch (InterruptedException ex) {
                Logger.getLogger(ReportGenerator.class.getName()).log(Level.SEVERE, null, ex);
            }

            fd = reportBuilder.getFileData();
        }

        if (fd != null && fd.getState() == BUILD_OK) {
            fd.setInline(inline);

            if (guardarCache) {
                reportCacheSession.addReport(fd);
            }
        }

        return fd;
    }
}

reportBuilder.start(); レポートを生成するための新しいスレッドです。問題は、行reportCacheSession.addReport(fd);の場合です。はCDIと呼ばれ、毎回新しいインスタンスを作成しますが、ReportCacheSessionは、javax.inject.Namedおよびjavax.enterprise.context.SessionScopedで注釈が付けられたセッションBeanです。

なぜこれが発生するのかわかりませんが、私の解決策は次のような新しい行を追加することです。

FileData fd = null;
reportCacheSession.toString(); //NEW LINE
reportBuilder = reportBuilderInstance.get();

reportCacheSession.toString(); スレッドが呼び出され、すべてが正常に機能する前に、ReportCacheSessionのインスタンスを作成します...

新しいスレッドはCDIにどのように影響しますか?以前にスレッドを呼び出したときに、CDIがセッションBeanの新しいインスタンスを作成したのはなぜですか?

更新08/15/12:

OK、EJBアノテーション@Asynchronousを使用するようにコードを変更しました。この場合、大きなPDFレポートを生成するときに問題が発生し(XLSレポートは問題なく機能します)、ファイルのサイズが不完全です(バイト数が少ない)。開こうとすると、空白で表示されます... JRExporter#exportReportメソッドの問題/バグかもしれません...

最後の更新:

わかりました。レポートの生成は私の間違いでした...問題は、EJB非同期またはJMSのどちらを使用するのが最適かということです。すべてのおかげで、それぞれのコメントは私に良い解決策を見つけるように導きました...

4

0 に答える 0