#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
- Вы создаете
MultipartObjectAssembler
:
MultipartObjectAssembler assembler =
createAssembler(request, uploadRequest, executorServiceToUse);
- Вы создаете новый запрос. Это вернет вам a
MultipartManifest
, который позже позволит вам проверить, не вышли ли из строя части.
manifest =
assembler.newRequest(
request.getContentType(),
request.getContentLanguage(),
request.getContentEncoding(),
request.getOpcMeta());
- Затем вы добавляете все части:
assembler.addPart(
ProgressTrackingInputStreamFactory.create(
chunk, progressTrackerFactory.getProgressTracker()),
chunk.length(),
null);
- Затем вы фиксируете. Это то, где ваш код в настоящее время выдает. Я подозреваю, что добавлены не все части.
CommitMultipartUploadResponse response = assembler.commit();
- Если что-то пойдет не так, проверьте
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