Взлом механизма хранения файлов Xodus для развертывания в Heroku или Openshift - PullRequest
1 голос
/ 25 апреля 2020

Каковы последствия (или проблемы, с которыми я могу столкнуться), если я попытаюсь взломать файловый ввод / вывод Xodus, поэтому я буду использовать ByteBuddy, чтобы заменить весь доступ к Java Файловому вводу / выводу, и что Xodus на самом деле будет " сохраняться "к этому интерфейсу вместо дискового ввода-вывода, так как я считаю неэффективным (и почти невозможным) постоянное хранилище на облачных платформах (Heroku, Openshift и многие другие) - так что этот хак, я думаю, заключается в создании мой собственный Java файловый ввод / вывод, который вместо сохранения на диск будет сохранен в более эластичном c хранилище, таком как Google Cloud Storage, S3 и другое хранилище объектов. Так что я могу запустить свое приложение в Heroku или Openshift.

Будет ли побочный эффект с Xodus, если я заменю File I / O на ByteBuddy или база данных Xodus будет c об этом?

1 Ответ

2 голосов
/ 25 апреля 2020

Для более чистого подхода вам следует изменить рефракцию на использование абстракции NIO2 FileSystem, а затем использовать файловую систему, которую вы намеревались использовать. В то же время я понимаю, что это не всегда возможно.

Если вы хотите заменить File API, возможно, самый простой способ - переопределить класс File для реализации операций таким образом, вы хотели. Взгляните на AgentBuilder API для этого и используйте RedefinitionStrategy.RETRANSFORM.

. При переопределении класса File вы можете использовать Advice, который встроен в код шаблонов, а также позволяет переопределить реализации , В этом случае вы можете использовать Advice в качестве перехватчика:

builder = builder.method(...).intercept(Advice.to(MyAdvice.class));

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

class MyAdvice {
  @Advice.OnMethodExit
  void exit(@Advice.Return(readOnly = false) Void value) {
    value = ...;
  }
}

Если вы хотите оставить части API File нетронутыми, вы также можете использовать совет в качестве декоратора:

builder = builder.visit(Advice.to(MyAdvice.class).on(...));

, где вы можете определить, должен ли исходный метод выполняться из метода ввода.

...