2

PlayにURLがあります!URLで渡される拡張子に応じてHTMLまたはXLSXのいずれかにルーティングするアプリで、次のようなルート行があります:-

# Calls
GET     /calls.{format}                         Call.index

したがって、calls.htmlはページをレンダリングし、calls.xlsxはExcelファイルをダウンロードします(Play Excelモジュールを使用)。ブラウザ、cURLリクエストなどからすべて正常に動作します。

メールを作成してExcelを添付できるようにしたいのですが、添付ファイルをプルできません。これが私が最初に試したものの基本バージョンです:-

public static void sendReport(List<Object[]> invoicelines, String emailaddress) throws MalformedURLException, URISyntaxException
    {
        setFrom("Telco Analysis <test@test.com>");
        addRecipient(emailaddress);
        setSubject("Telco Analysis report");
        EmailAttachment emailAttachment = new EmailAttachment();
        URL url = new URL("http://localhost:9001/calls.xlsx");

        emailAttachment.setURL(url);
        emailAttachment.setName(url.getFile());
        emailAttachment.setDescription("Test file");
        addAttachment(emailAttachment);
        send(invoicelines);
    }

ただし、URLコンテンツをプルするのではなく、エラーメッセージなしでそのまま表示され、Chromeのページスピナーが実行されてWebサーバーが拘束されます(別のブラウザー/マシンからのリクエストが処理されていないように見えるまで) 。添付ファイルなしでメールを送信すると、すべて問題ないので、問題のように見えるのはファイルのプルだけです。

これまで、上記の方法、PlayのWS Webサービスライブラリ、手動で作成したHttpRequestsなどを試しました。別のURL(http://www.google.comなど)を指定すると機能します。大丈夫です。

誰か助けてくれますか?

4

1 に答える 1

1

私はあなたが開発モードで実行していると仮定しています。

開発モードでは、単一のリクエスト実行プールがある可能性がありますが、電子メールを送信するコントローラーでは、2番目のリクエストを送信します。これは、前のリクエストが完了するまでブロックされます(待機しているため、ブロックされません)。応答する2番目の要求の場合)... so .... deadlock!外部リクエストが正常に機能する理由は、Playリクエストプールでデッドロックが発生していないためです。

play.pool問題に対する簡単な答えは、application.confのの値を増やすことです。コメントがないことを確認し、1より大きい値を選択してください。

# Execution pool
# ~~~~~
# Default to 1 thread in DEV mode or (nb processors + 1) threads in PROD mode.
# Try to keep a low as possible. 1 thread will serialize all requests (very useful for debugging purpose)
play.pool=3
于 2012-08-10T11:43:42.677 に答える