1

Google App Engine で executor フレームワークを使用しようとしています。以下は、実行しようとしているコードです。

Thread thread = ThreadManager.createBackgroundThread(new Runnable(){
            public void run(){
                          try{
                                  LOGGER.info( "Checking background thread");                            
                                  Thread.sleep(10);
                              }
                          catch (InterruptedException ex){
                                           throw new RuntimeException("Exception:", ex);
                              }
                         }
                    });
ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(10, ThreadManager.backgroundThreadFactory());
executor.scheduleAtFixedRate(thread, 0, 30, TimeUnit.MINUTES);

しかし、これはスレッドを開始しません。しかし、thread.start()を使用すると、正しく動作します。Whitelisted Classesを確認しましたが、Executor クラスが提供されています。だから私はそれを間違っているのですか?

4

1 に答える 1

0

サイカット、

App Engine でスレッドを作成することは常に避けるようにしてください。これは分散型で動的な性質であるため、非常に悪い結果や予期しない結果が生じる傾向があるためです。

あなたの場合、複数のインスタンスが複数の(ローカル)スレッドを生成し、同じ通知を何度も送信します。また、GAE フロントエンド インスタンスには1 分間のリクエスト制限があるため、それ以降はサーバーがそのリクエストを強制終了することに注意してください。

幸いなことに、App Engine はまさにこの状況に対応するCron サービスを提供しています。

Cron サービスを使用すると、ジョブを特定の時刻または特定の期間ごとに実行するようにスケジュールできます。cron がトリガーされると、GAE は構成された URL を呼び出して、プロセスを実行できるようにします。この場合、通知を送信します。

例:(提供されたリンクから)

 <cron>
    <url>/weeklyreport</url>
    <description>Mail out a weekly report</description>
    <schedule>every monday 08:30</schedule>
    <timezone>America/New_York</timezone>
  </cron>

毎週月曜日の 8:30 に /weeklyreport に HTTP リクエストを送信します。

于 2015-03-25T02:43:39.513 に答える