Причина сбоя в хранилище объектов MultipartObjectAssembler OCI

#oracle-cloud-infrastructure #oci-java-sdk

#oracle-cloud-инфраструктура #oci-java-sdk

Вопрос:

Я использую MultipartObjectAssembler для загрузки данных из базы данных в хранилище объектов OCI. Есть ли способ узнать причину сбоя при использовании multipart upload?

Когда я пытаюсь зафиксировать ассемблер, я получаю исключение IllegalStateException с сообщением «Одна или несколько частей не были успешно загружены». Я хотел бы знать, почему какая-либо часть вышла из строя? Я не смог найти способ получить эту информацию из SDK.

 try {
    assembler.addPart(new ByteArrayInputStream(part, 0, length),
                    length,
                    null);

    assembler.commit();
} catch (Exception e) {
    assembler.abort();
    throw new RuntimeException(e.getMessage());
} 
  

Редактировать: мне нужно получить исключение, вызванное отказавшей частью, и распространить сообщение об ошибке.

Ответ №1:

Есть ли причина, по которой вы не используете UploadManager ? Он должен сделать все за вас, включая добавление частей и фиксацию. Вот сквозной пример: https://github.com/oracle/oci-java-sdk/blob/master/bmc-examples/src/main/java/UploadObjectExample.java

Если по какой-либо причине вы не можете использовать UploadManager , тем не менее, ознакомьтесь с его исходным кодом, поскольку он демонстрирует предполагаемое использование MultipartObjectAssembler : https://github.com/oracle/oci-java-sdk/blob/master/bmc-objectstorage/bmc-objectstorage-extensions/src/main/java/com/oracle/bmc/objectstorage/transfer/UploadManager.java#L175-L249

  1. Вы создаете MultipartObjectAssembler :
 MultipartObjectAssembler assembler =
                createAssembler(request, uploadRequest, executorServiceToUse);
  
  1. Вы создаете новый запрос. Это вернет вам a MultipartManifest , который позже позволит вам проверить, не вышли ли из строя части.
 manifest =
                    assembler.newRequest(
                            request.getContentType(),
                            request.getContentLanguage(),
                            request.getContentEncoding(),
                            request.getOpcMeta());
  
  1. Затем вы добавляете все части:
                     assembler.addPart(
                            ProgressTrackingInputStreamFactory.create(
                                    chunk, progressTrackerFactory.getProgressTracker()),
                            chunk.length(),
                            null);
  
  1. Затем вы фиксируете. Это то, где ваш код в настоящее время выдает. Я подозреваю, что добавлены не все части.
 CommitMultipartUploadResponse response = assembler.commit();
  
  1. Если что-то пойдет не так, проверьте MultipartManifest.listCompletedParts() , MultipartManifest.listFailedParts() , и MultipartManifest.listInProgressParts() . В манифесте должно быть указано, какие части вышли из строя. К сожалению, не причина; для этого вы можете включить ERROR ведение журнала уровня для com.oracle.bmc.objectstorage.transfer ( com.oracle.bmc.objectstorage.transfer.internal.MultipartTransferManager в частности, для класса).

Если я что-то неправильно понял, пожалуйста, дайте мне знать. В этом случае больший и более полный фрагмент кода поможет мне в отладке. Спасибо!

Комментарии:

1. Я не могу использовать UploadManger, поскольку раньше у меня не будет всех данных. MultiPartObjectAssembler работает нормально для меня, за исключением случаев, когда загрузка прерывается из-за какой-либо ошибки (скажем, проблемы с сетью). В этих сценариях мне нужна точная причина, по которой произошел сбой при загрузке, и необходимо распространить ошибку. Я попробовал MultipartManifest, но он не указывает причину сбоя, как вы также упомянули.

2. Хорошо, это имеет смысл. Извините, сейчас это невозможно. Я принял сообщение о причине сбоя за запрос функции, и мы добавим это в будущую версию. Если хотите, вы также можете создать проблему с GitHub. Это позволяет другим пользователям также запрашивать эту функцию.

3. Спасибо. Я создам проблему с Github

4. Привет @akshay, мой товарищ по команде Яш хотел бы, чтобы я сообщил вам, что это изменение уже реализовано и выпущено. Java SDK (v1.27.1) был добавлен с возможностью получения списка неисправных деталей вместе с исключением, которое вызвало сбой деталей. MultipartManifest теперь предоставляет функцию MultipartManifest.listFailedPartsDetails() , которая возвращает список MultipartUploadFailedPartDetails , который состоит из номера детали и причины сбоя. Пожалуйста, проверьте вашу проблему на GitHub для получения подробной информации: github.com/oracle/oci-java-sdk/issues/264