Круговая зависимость для многоузлового модуля (Xodus) - PullRequest
0 голосов
/ 01 июля 2019

После нескольких испытаний я обнаружил, что использовать модуль multinode вообще невозможно.Поскольку мультиузел зависит от модуля entity-store и наоборот.Таким образом, включение модуля multinode в конфигурацию Gradle хранилища сущностей вызывает циклическую зависимость.

Во всяком случае, я все еще пытаюсь взломать.По сути, основная проблема, которую я нахожу, - это создание S3BlobVault, так как легко (ре) создать S3DataReaderWriterProvider из-за пределов проекта Xodus, основной проблемой является S3BlobVault, который нуждается в экземпляре PersistentEntityStoreImpl это означает, что его (S3BlobVault) необходимо создать внутри / внутри PersistentEntityStoreImpl , что совершенно невозможно из-за проблемы круговой зависимости.

По крайней мере, я это сделализмените PersistentEntityStoreImpl и добавьте:

public void setBlobVault(BlobVault blobVault) { 
    this.blobVault = blobVault;
}

Затем в своем коде (приложении) я добавил

final PersistentEntityStoreImpl store = PersistentEntityStores.newInstance(environment); 
S3BlobVault s3BlobVault = createS3BlobVault(store, environment.getLocation());
store.setBlobVault(s3BlobVault);

Создание хранилища следующим образом:

  private S3BlobVault createS3BlobVault(PersistentEntityStoreImpl store, String location) { 
    try {
      S3AsyncClient s3 = S3AsyncClient.builder()
              .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("", "")))
              .endpointOverride(new URI("https://s3.wasabisys.com"))
              .region(Region.US_EAST_1).build();
      S3BlobVault blobVault = null;
// Can't use code below (outside of package)

//      try {
//        final PersistentSequenceBlobHandleGenerator.PersistentSequenceGetter persistentSequenceGetter =
//                new PersistentSequenceBlobHandleGenerator.PersistentSequenceGetter() {
//                  @Override
//                  public PersistentSequence get() {
//                    return getSequence(getAndCheckCurrentTransaction(), BLOB_HANDLES_SEQUENCE);
//                  }
//                };
//        blobVault = new S3BlobVault(store,
//                new PersistentSequenceBlobHandleGenerator(persistentSequenceGetter), s3, "xodus", location, ".blobs", null);
//      } catch (UnexpectedBlobVaultVersionException e) {
//        blobVault = null;
//      }
      if(blobVault == null) {
        blobVault = new S3BlobVault(store,
                BlobHandleGenerator.IMMUTABLE, s3, "xodus", location, ".blobs", null);
      }
      return blobVault;
    } catch (Exception e) {
      throw ExodusException.toExodusException(e);
    }
  }

Iпо-прежнему заканчивается ошибка:

Caused by: java.io.FileNotFoundException: s3:xodus\blobs\version (The filename, directory name, or volume label syntax is incorrect) 
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
at jetbrains.exodus.entitystore.FileSystemBlobVaultOld.<init>(FileSystemBlobVaultOld.java:106)
at jetbrains.exodus.entitystore.FileSystemBlobVaultOld.<init>(FileSystemBlobVaultOld.java:71)
at jetbrains.exodus.entitystore.PersistentEntityStoreImpl.createDefaultFSBlobVault(PersistentEntityStoreImpl.java:424)
... 95 more

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

В вашем проекте вы можете добавить зависимость от многоузлового фляги и создать PersitentEntityStore таким образом:

final S3BlobVault blobVault = createBlobVault(...);
final Environment env = Environments.newInstance("location");
final PersistentEntityStoreImpl store = PersistentEntityStores.newInstance(PersistentEntityStoreConfig.DEFAULT, env, blobVault, "entityStore name");

Возможно, это будет работать. По крайней мере, если вы передадите хранилище BLOB-объектов для создания PersistentEntityStore, вам не потребуется указанная циклическая зависимость. Зависимости от многоузлового модуля достаточно для использования функциональности модуля хранилища сущностей.

Однако, я должен подчеркнуть, что любая функциональность в многоузловом модуле является неполной, не объявленной, не документированной и может быть изменена . Он может быть полностью удален в будущих версиях.

1 голос
/ 01 июля 2019

Xodus build 1.3.91 использует функциональность S3 в качестве экспериментальной функции.В документации нет ссылок на это, а некоторые тесты не прошли проверку хранилища файлов S3.Мы не рекомендуем использовать его в производственном коде до тех пор, пока в примечаниях к выпуску нет упоминаний и нет разделов в документации.

Результат использования S3 в качестве хранилища для Xodus на данный момент непредсказуем.

...