java - 应用程序引擎上任务队列中单例的行为

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

当应用程序引擎旋转新实例时,我的静态变量会发生什么?更具体地说,我使用的任务队列可以有 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. 单例是 WorkerThread 类的内部类还是 WorkerThread 类正在访问的另一个类,这有关系吗?

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

我希望问题很清楚。我希望所有实例中只有一个我的单例实例。如果问题不清楚,请要求澄清。

更新

以下是我的具体用例

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

最佳答案

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

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

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

关于java - 应用程序引擎上任务队列中单例的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30585365/

相关文章:

java - ExecutorService 在频繁关闭后导致内存不足异常

java - 同步多个线程写入java中的同一个文件

python - GAE强制推送任务队列执行下一个任务

python - PyCharm 记录输出颜色

google-app-engine - 最终一致性是否适用于查询结果集?或者返回的实体本身?

java - 如何为数组中创建的对象分配和获取值?

java - 如何在JavaFX中一一显示StrokeTransition的ArrayList?

java - IntelliJ Spring 配置问题

java - Spring MVC 默认值不起作用

c# - VS 2012 在错误的线程上中断