app-engine上任务队列中单例的行为

时间:2015-06-02 00:12:01

标签: java multithreading google-app-engine singleton task-queue

当app-engine旋转新实例时,我的静态变量会发生什么?更具体地说,我使用的任务队列可以有40个实例/线程。在相关的Servlet中,我使用的是单例,如

public class WorkerThread  extends HttpServlet {
    @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      ..
      MySingleton single = MySingleton.getInstance();
      ..
    }
    ...
}

以下是如何创建单身人士

public class MySingleton {

  public static I  MySingleton getInstance() {
    return   MySingletonHolder.INSTANCE;
  }

  private static class MySingletonHolder {
    public static final MySingleton INSTANCE = new MySingleton();
  }

  private   MySingleton() {

  }
  ..
}

我有以下问题:

  1. 由于这是一个任务队列,我是否需要担心App-Engine启动新实例以满足高要求?

  2. 如果singleton是WorkerThread类的内部类或WorkerThread类正在访问的另一个类,这是否重要?

  3. 任务队列实例是否独立?相信他们是但不确定。

  4. 我希望问题很清楚。我希望在所有实例中只有一个我的单例实例。如果问题不明确,请询问澄清。

    更新

    以下是我的确切用例

    public class SingletonProductIndexWriter {
    
      private static final Logger LOG = Logger.getLogger(SingletonProductIndexWriter.class.getName());
    
      public static IndexWriter getSingleIndexWriter() {
        return IndexWriterHolder.INDEX_WRITER;
      }
    
      private static class IndexWriterHolder {
    
        static PorterAnalyzer analyzer = new PorterAnalyzer();
        static GaeDirectory index = new GaeDirectory(LuceneWorker.PRODUCTS);// create product index
        static IndexWriterConfig config = GaeLuceneUtil.getIndexWriterConfig(LuceneWorker.LUCENE_VERSION, analyzer);
        public static final IndexWriter INDEX_WRITER =  getIndexWriter();
    
    
        private static IndexWriter getIndexWriter() {
          try {
            LOG.info("Create single index writer for workers");
            return new IndexWriter(index, config);
          }catch(IOException e){
            return null;
          }
        }
      }
    }
    

    称为

    IndexWriter writer = SingletonProductIndexWriter.getSingleIndexWriter();
    

    有关相关详细信息,请参阅Stack Overflow线程:Worker threads cause Lucene LockObtainFailedException

1 个答案:

答案 0 :(得分:2)

Push和Pull队列都由标准实例处理(您可以在queue.xml中定位模块/前端/后端)。实例将扩展以满足您的正常流量和队列的需求。

Singletons(在这里描述的经典意义上)只对它们所加载的类加载器是唯一的 - 它们在你的应用程序的appengine实例上并不是唯一的 - 不会共享任何状态。使用此模式,每个appengine实例将有一个单例。

如果您需要共享状态,则需要使用数据存储区/云sql /。