Azure-sdk-for-java: [バグ] blobListに察する無限の反埩

䜜成日 2020幎03月24日  Â·  53コメント  Â·  ゜ヌス: Azure/azure-sdk-for-java

ク゚リ/質問
次のコヌドを呌び出すずき

    PagedIterable<BlobItem> items = azure.listBlobsByHierarchy(path);
    ArrayList<String> strings = new ArrayList<>();
    for (BlobItem item : items) {
      strings.add(item.getName());
    }
    return strings;

ルヌプは無限であり、垞にitem1 → item2 → item3 → item1 →  繰り返すこずが刀明したした

なぜこれはバグや機胜リク゚ストではないのですか
クリヌンな環境では再珟できないので、バグのようには芋えたせん。 私のカスタム環境は、IDEAでAzure BlobStorageを参照するためのプラグむンです。

セットアップ該圓する堎合は次の情報を入力しおください

  • OSManjaro Linux、19.0.2、カヌネル5.5.8-1-MANJARO
  • IDEIntelliJ
  • 䜿甚したラむブラリのバヌゞョン12.5.0
Azure.Core Client Storage customer-reported

最も参考になるコメント

䞊蚘のIntelliJプラグむンスレッドにリストされおいる手順に埓うず、JacksonはServiceLoaderを䜿甚できたす。

Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());

ただし、これがプラグむンの最適な゜リュヌションであるかどうかはわかりたせん。

党おのコメント53件

こんにちは、@ asm0dey。 これはかなり予期しない動䜜のように聞こえたす。 リストの結果がこのようにルヌプするこずを意図しおいないこずを保蚌できたす PagedIterableが繰り返し芁求を発行しおいるか、単に重耇したキャッシュ倀を発行しおいるかを確認できるように、ネットワヌクトレヌスをキャプチャするこずはできたすか そしお、あなたはあなたのコンテナにそれらの3぀のブロブだけを持っおいたすか それずも、あなたが芋おいないより倚くの期埅される結果がありたすか

PSきちんずしたプラグむンのように聞こえたす:)

絶察にできたすが、リク゚ストずレスポンスの本文がログに蚘録されない理由がわかりたせん。

しかし、繰り返しになりたすが、クリヌンな環境ではこの動䜜を再珟できないため、これが本圓のバグであるずは思いたせん。クラスパス/クラスロヌダヌなどの問題です。

PSそしお、はい、あなたは間違いなくこのプラグむンを奜きになるでしょう、それはhttps://plugins.jetbrains.com/plugin/12494-big-data-toolsです
6日以降の次のEAPリリヌスでAzureが実装されるこずを期埅しおいたす

それは玠晎らしいこずです。 ありがずう リク゚ストずレスポンスの本文は非垞に倧きくなる可胜性があるため、通垞はログに蚘録されるずは思いたせん。

ある皮のクラスパス゚ラヌが疑われる堎合は、mvn d ependencytreeから始めお、䜕が起こっおいるのかを確認できたすか 䜕か奇劙なこずを匕き起こすいく぀かの衝突があるかもしれたせん。

うわヌ、それは玠晎らしいこずだ そのプロゞェクトに取り組んでいただきありがずうございたす。䜕らかの圢でサポヌトできる堎合は、お知らせください。 私たちは、䞀般的にストレヌゞずAzureの呚りのツヌルを構築するコミュニティの他の人々に䌚うのが倧奜きです

Mavenやgradleのような埓来のビルドシステムがないため、それほど簡単ではありたせん。IDEA自䜓を䜿甚しおおよびCIサヌバヌ䞊でもプロゞェクトをビルドしおいたす。

ただし、ここで䟝存関係のUML図を芋぀けおください。

私はここで矛盟するものを実際に芋぀けるこずはできたせんが、私はリアクタヌの経隓があたりなく、䜕がそれを間違った方法で機胜させるこずができるか想像さえできたせん。

ロギングに぀いおヘッダヌず本文をログに蚘録するオプションがありたすが、本文のサむズがヘッダヌからわかっおいる堎合は、本文をログに蚘録できたすが、ログによるずヘッダヌはありたせん。

これがログの小さな断片です

2020-03-25 09:43:08,627 [57159248]   INFO - rvice.listBlobHierarchySegment - --> GET https://pavelfinkelshteynjb.blob.core.windows.net/testcontainer1?prefix=&delimiter=/&marker=REDACTED&restype=REDACTED&comp=REDACTED
Date:Wed, 25 Mar 2020 06:43:08 GMT
Authorization:REDACTED
Content-Length:0
x-ms-version:REDACTED
x-ms-client-request-id:c4016194-f020-45fc-b254-11a04fd65d52
User-Agent:azsdk-java-azure-storage-blob/12.5.0 (11.0.6; Linux 5.5.8-1-MANJARO)
(empty body)
--> END GET

2020-03-25 09:43:08,639 [57159260]   INFO - rvice.listBlobHierarchySegment - <-- 200 https://pavelfinkelshteynjb.blob.core.windows.net/testcontainer1?prefix=&delimiter=/&marker=REDACTED&restype=REDACTED&comp=REDACTED (68 ms, unknown-length body)
Date:Wed, 25 Mar 2020 06:43:07 GMT
Server:Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:chunked
x-ms-version:REDACTED
Content-Type:application/xml
x-ms-request-id:REDACTED
x-ms-client-request-id:7836d3ae-cf10-4432-a511-479dbf4ec09d
(body content not logged)
<-- END HTTP 

クラスcom.azure.core.http.policy.HttpLoggingPolicyには、メ゜ッドlogResponseがありたす。

                String contentTypeHeader = response.getHeaderValue("Content-Type");
                long contentLength = this.getContentLength(logger, response.getHeaders());
                if (this.shouldBodyBeLogged(contentTypeHeader, contentLength)) {
// snip

                } else {
                    responseLogMessage.append("(body content not logged)").append(System.lineSeparator()).append("<-- END HTTP");
                    return this.logAndReturn(logger, responseLogMessage, response);

そしおメ゜ッドgetContentLength

    private long getContentLength(ClientLogger logger, HttpHeaders headers) {
        long contentLength = 0L;
        String contentLengthString = headers.getValue("Content-Length");
        if (CoreUtils.isNullOrEmpty(contentLengthString)) {
            return contentLength;
// snip

したがっお、このAPIはボディのロギングをサポヌトしおいたせん。

@ asm0dey遅れおすみたせん。 クラむアントビルダヌのHttpLogOptionsを曎新しお、allowedQueryParameterずしお「マヌカヌ」を远加できたすか ログから線集されおいるようです。おそらく、䜕かが同じマヌカヌで䜕床もリスト呌び出しをトリガヌしおいるのではないかず思いたす。 偶然にも、ここで行っおいる開発で同様の動䜜が芋られたしたが、それも同じ原因である可胜性がありたす。

UMLダむアグラムには目立぀ものは䜕もありたせんが、これたで芋たこずがありたせん。

絶察。 添付の完党なログを芋぀けおください
idea.log
マヌカヌはずっず空です

grep marker= idea.log | moreは、 GET https://pavelfinkelshteynjb.blob.core.windows.net/testcontainer1?prefix=&delimiter=/&marker=&restype=REDACTED&comp=REDACTEDが垞に繰り返されるリク゚ストがあるこずを瀺しおいたす

たた、非垞に倚くのリク゚ストがあるこずがわかりたす673。クラむアント偎からの2〜4件のリク゚ストのようでした。

@ rickle-msftこれに関するアむデアはありたすか

@ rickle-msftはフレンドリヌなリマむンダヌです

こんにちは、@ asm0dey。 遅れおすみたせん GitHubからのメヌルがしばらくの間正しくフィルタリングされおいたせんでした。それに気づいお修正したずきも、この問題を芋逃しおいたに違いありたせん。 改めおお詫び申し䞊げたす。リマむンダヌをありがずうございたす。

ええ、すべおのリク゚ストに空のmarker=ク゚リパラメヌタがあるのは興味深いこずです。 その特定の動䜜を再珟できる唯䞀の方法は、継続トヌクンずしお空の文字列を明瀺的に枡すこずです。それでも無限にルヌプするこずはありたせん。

@anuchandy提案されおいるように、䜕らかの䟝存関係の問題がこれを匕き起こしおいる可胜性があるかどうかに぀いお、䜕か感芚がありたすか 圌はシェヌディングされた12.5.0jarを䜿甚しおいるようですが、私はjarシェヌディングず、それがクラスパスおよびクラスロヌダヌずの盞互䜜甚にどのように圱響するかに぀いおあたり詳しくありたせん。

実際、私はそれをアンシェヌドしようずしたしたが、文字通り䜕も倉わりたせん
この振る舞いで。 たた、私はパッケヌゞ名やsmthのようなものを倉曎しおいたせん
それ。

私は原子炉プロゞェクト開発者の䞀人にも連絡を取りたしたが、圌の唯䞀のアむデアは
むテレヌタは呌び出しごずに再䜜成されおいるずいうこずでした。
20/04/29 10:53 AMに、RickLeyは次のように曞いおいたす。

こんにちは、@ asm0dey。 遅れおすみたせん GitHubからのメヌルがしばらくの間正しくフィルタリングされおいたせんでした。それに気づいお修正したずきも、この問題を芋逃しおいたに違いありたせん。 改めおお詫び申し䞊げたす。リマむンダヌをありがずうございたす。

ええ、すべおのリク゚ストに空のmarker=ク゚リパラメヌタがあるのは興味深いこずです。 その特定の動䜜を再珟できる唯䞀の方法は、継続トヌクンずしお空の文字列を明瀺的に枡すこずです。それでも無限にルヌプするこずはありたせん。

@anuchandy提案されおいるように、䜕らかの䟝存関係の問題がこれを匕き起こしおいる可胜性があるかどうかに぀いお、䜕か感芚がありたすか 圌はシェヌディングされた12.5.0jarを䜿甚しおいるようですが、私はjarシェヌディングず、それがクラスパスおよびクラスロヌダヌずの盞互䜜甚にどのように圱響するかに぀いおあたり詳しくありたせん。

-
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください。
https://github.com/Azure/azure-sdk-for-java/issues/9465#issuecomment -621366540

-
よろしく、
パシャ

ビッグデヌタツヌル@JetBrains

@ asm0dey

セットアップで次のコヌドを実行し、出力ずしお衚瀺されるものを共有しおください。 はい、それは無限に実行されたす。 Processing Page:start 3〜4回衚瀺した埌で䞭断したす。

BlobContainerAsyncClient blobContainerClient = new BlobContainerClientBuilder()
        .endpoint("<your-storage-account-url>")
        .sasToken("<your-sasToken>")
        .containerName("mycontainer")
        .buildAsyncClient();

PagedFlux<BlobItem> flux = blobContainerClient.listBlobsByHierarchy(path);
flux.byPage()
        .doOnNext(new Consumer<PagedResponse<BlobItem>>() {
            <strong i="9">@Override</strong>
            public void accept(PagedResponse<BlobItem> response) {
                System.out.println("Processing Page:start");
                List<BlobItem> items = response.getValue();
                for (BlobItem item : items) {
                    System.out.println(item.getName());
                }
                if (response.getContinuationToken() == null) {
                    System.out.println("ContinuationToken: null");
                } else if (response.getContinuationToken().length() == 0) {
                    System.out.println("ContinuationToken: empty");
                } else {
                    System.out.println("ContinuationToken: non-empty:" + response.getContinuationToken());
                }
                System.out.println("Processing Page:end");
            }
        }).blockLast();

ずころで、必芁に応じおアむテム名を線集しおください。continuationTokenのnull | empty | non-empty属性に興味がありたす。

遅れお申し蚳ありたせんが、それはTZの違いだず思いたす。
ここにありたす

Processing Page:start
.travis.yml
build.sh
.git/
KateTest12/
KateTest1234/
KateTest12345/
KateTestRenamed/
Test1/
demo/
plugins/
ContinuationToken: empty
Processing Page:end
Processing Page:start
.travis.yml
build.sh
.git/
KateTest12/
KateTest1234/
KateTest12345/
KateTestRenamed/
Test1/
demo/
plugins/
ContinuationToken: empty
Processing Page:end
Processing Page:start
.travis.yml
build.sh
.git/
KateTest12/
KateTest1234/
KateTest12345/
KateTestRenamed/
Test1/
demo/
plugins/
ContinuationToken: empty
Processing Page:end

私はkotlinで曞いおいるので、コヌドは少し異なりたす。

    BlobServiceClientBuilder()
      .endpoint(endpoint)
      .apply { authProvider(this) }
      .httpClient(NettyAsyncHttpClientBuilder().build())
      .buildAsyncClient()
      .getBlobContainerAsyncClient(container)
      .listBlobsByHierarchy("")
      .byPage()
      .doOnNext { response ->
        println("Processing Page:start")
        val items = response.value
        for (item in items) {
          println(item.name)
        }
        when {
          response.continuationToken == null -> println("ContinuationToken: null")
          response.continuationToken.isEmpty() -> println("ContinuationToken: empty")
          else -> println("ContinuationToken: non-empty:" + response.continuationToken)
        }
        println("Processing Page:end")
      }
      .blockLast()

たた、クラスロヌダヌの問題が原因でhttpクラむアントが自動怜出されないこずに぀いおも既に䞍満を述べおいるため、手動で䜜成する必芁がありたす。

䜕も倉わらないこずを願っおいたす。

@ asm0deyこれを共有しおくれおありがずう

@ rickle-msft-出力から、最埌のペヌゞのマヌカヌ別名continuationTokenがnullではなく""空であるように芋えたす。 「ペヌゞフェッチルヌプ」の終了基準は、 null継続トヌクンです。
これが無限ルヌプに入っおいる理由だず思いたす。

䞊蚘のコヌドをロヌカルで実行するず、最埌のペヌゞのマヌカヌプロパティ倀は垞にnullため、ストレヌゞアカりントで再珟できたせん。 出力は次のようになりたす。

Processing Page:start
foo.jpeg
ContinuationToken: null. <------  [In Paul's case this is an empty string ""]
Processing Page:end

これを手動でデバッグモヌドで空の文字列""に蚭定するず、無限ルヌプに陥っおいるこずがわかりたす。

有線のストレヌゞサヌビスがmarkerプロパティを空の文字列ずしお返し、それが最埌のペヌゞであるこずを瀺しおいる可胜性はありたすか

@anuchandy次のペヌゞがない堎合、サヌビスは垞に空のxml芁玠<NextMarker />返すず思いたす。 残りのドキュメントには、「Prefix、Marker、MaxResults、およびDelimiter芁玠は、リク゚ストURIで指定された堎合にのみ存圚するこずに泚意しおください。NextMarker芁玠には、リストの結果が完党でない堎合にのみ倀がありたす。」 これは、NexMarkerが垞に存圚するこずを意味するず思いたすが、垞に䟡倀があるずは限りたせん。

異なる環境が原因で、デシリアラむザヌがnullではなく空の文字列を生成する可胜性はありたすか nullだけでなく、nullたたは空のチェックを行うこずもできたすか

私たちの環境で「」をnullに眮き換えるこずを再珟するための最小限のテストに関するアむデアはありたすか

@ rickle-msft参照しおいただきありがずうございたす。 数人に連絡しお戻っおきたしょうが、前のランタむムは実際に空の文字列を終了条件refずしお扱っおいるこずがわかりたす。

while (nextPageLink != null && nextPageLink != "") {

完党にはわかりたせんが、これはおそらく、次のトヌクンのタむプがString堎合、䞀郚のAzureサヌビスが完了を瀺すために空の文字列を䜿甚しおいる可胜性があるこずを瀺しおいたす。

DataLakeServiceClient.listFileSystemsメ゜ッドによっお返されるIterableでも同じ問題が発生しおいたす。 䞊蚘の提案のように、非同期クラむアントず印刷されたマヌカヌを䜿甚するず、空の文字列が衚瀺されたす。

@rodburgett環境に関する情報を投皿するず圹立぀ず思いたす。 おそらく、私たちの環境で䞀般的なものを芋぀けるこずができたす。

@ asm0dey私たちの環境で唯䞀䞀般的な芁玠はblobストレヌゞjarであり、そこでも異なるバヌゞョンを䜿甚しおいるず思いたす。 Gradleを䜿甚しおWindows10で䜜業しおいたす。 私は最初に、azure-storage-blobjarのバヌゞョン12.3.0でこの問題に遭遇したした。 最近12.6.0にアップグレヌドしたしたが、匕き続き問題が発生したす。

@ asm0dey、@rodburgett -チヌム内で我々はそれが倚くの玺碧-サヌビスの堎合ず䞎えられただけでなく「」ペヌゞングを終了させる信号を凊理するこずに぀いお議論したした。 そのドラフトを開きたした。 この問題により、コアレベルで䞍足しおいる別の機胜が特定されたす

あなたは意志に実行しおいる無限ルヌプの問題は、この倉曎の副䜜甚ずしお消えたすが、それは理解するこずは興味深いですなぜ、あなたの環境の扱いずしお空のXMLノヌド""の代わりにnull 。

アプリケヌションのクラスパスにロヌドされるJacksonのバヌゞョンを共有できたすか

Jackson jarsv2.10.2を䜿甚しおいたす。

@anuchandyは、圹立぀堎合は私の完党なクラスパスです。

accessors-smart-1.2.jar
aircompressor-0.15.jar
annotations-17.0.0.jar
asm-5.0.4.jar
avro-1.8.0.jar
avro-1.8.2.jar
aws-java-sdk-bundle-1.11.375.jar
azure-core-1.4.0.jar
azure-core-http-netty-1.5.0.jar
azure-storage-blob-12.6.0.jar
azure-storage-common-12.6.0.jar
bigdatatools.jar
commons-beanutils-1.9.3.jar
commons-beanutils-1.9.4.jar
commons-cli-1.2.jar
commons-codec-1.11.jar
commons-codec-1.5.jar
commons-collections-3.2.2.jar
commons-collections4-4.4.jar
commons-compress-1.4.1.jar
commons-compress-1.8.1.jar
commons-configuration2-2.1.1.jar
commons-io-2.5.jar
commons-lang-2.6.jar
commons-lang3-3.7.jar
commons-lang3-3.9.jar
commons-logging-1.1.3.jar
commons-logging-1.2.jar
commons-math3-3.1.1.jar
commons-net-3.6.jar
commons-pool-1.5.4.jar
commons-text-1.4.jar
commons-text-1.8.jar
curator-client-2.12.0.jar
curator-framework-2.12.0.jar
curator-recipes-2.12.0.jar
diff-match-patch-1.2.jar
dnsjava-2.1.7.jar
fastutil-6.5.7.jar
google-cloud-storage-1.105.2.jar
guava-11.0.2.jar
hadoop-annotations-3.2.0.jar
hadoop-auth-3.2.0.jar
hadoop-aws-3.2.0.jar
hadoop-client-3.2.0.jar
hadoop-common-3.2.0.jar
hadoop-distcp-3.2.1.jar
hadoop-hdfs-client-3.2.0.jar
hadoop-mapreduce-client-common-3.2.0.jar
hadoop-mapreduce-client-core-3.2.0.jar
hadoop-mapreduce-client-jobclient-3.2.0.jar
hadoop-yarn-api-3.2.0.jar
hadoop-yarn-client-3.2.0.jar
hadoop-yarn-common-3.2.0.jar
hive-storage-api-2.6.0.jar
htrace-core4-4.1.0-incubating.jar
jackson-annotations-2.10.1.jar
jackson-core-2.10.1.jar
jackson-core-asl-1.9.11.jar
jackson-core-asl-1.9.13.jar
jackson-databind-2.10.1.jar
jackson-dataformat-xml-2.10.1.jar
jackson-datatype-jsr310-2.10.1.jar
jackson-mapper-asl-1.9.11.jar
jackson-mapper-asl-1.9.13.jar
jackson-module-jaxb-annotations-2.10.1.jar
jakarta.activation-api-1.2.1.jar
jakarta.xml.bind-api-2.3.2.jar
javax.servlet-api-3.1.0.jar
jaxb-api-2.2.11.jar
jcip-annotations-1.0-1.jar
jersey-client-1.19.jar
jersey-core-1.19.jar
jersey-servlet-1.19.jar
json-smart-2.3.jar
jsoup-1.12.1.jar
jsp-api-2.1.jar
jsr305-3.0.0.jar
jsr311-api-1.1.1.jar
kerb-admin-1.0.1.jar
kerb-client-1.0.1.jar
kerb-common-1.0.1.jar
kerb-core-1.0.1.jar
kerb-crypto-1.0.1.jar
kerb-identity-1.0.1.jar
kerb-server-1.0.1.jar
kerb-simplekdc-1.0.1.jar
kerb-util-1.0.1.jar
kerby-asn1-1.0.1.jar
kerby-config-1.0.1.jar
kerby-pkix-1.0.1.jar
kerby-util-1.0.1.jar
kerby-xdr-1.0.1.jar
log4j-1.2.17.jar
moshi-1.7.0.jar
moshi-adapters-1.7.0.jar
moshi-kotlin-1.7.0.jar
netty-buffer-4.1.45.Final.jar
netty-codec-4.1.45.Final.jar
netty-codec-http-4.1.45.Final.jar
netty-codec-http2-4.1.45.Final.jar
netty-codec-socks-4.1.45.Final.jar
netty-common-4.1.45.Final.jar
netty-handler-4.1.45.Final.jar
netty-handler-proxy-4.1.45.Final.jar
netty-resolver-4.1.45.Final.jar
netty-tcnative-boringssl-static-2.0.27.Final.jar
netty-transport-4.1.45.Final.jar
netty-transport-native-epoll-4.1.45.Final-linux-x86_64.jar
netty-transport-native-unix-common-4.1.45.Final.jar
nimbus-jose-jwt-4.41.1.jar
nv-websocket-client-2.9.jar
okhttp-2.7.5.jar
okhttp-3.14.7.jar
okio-1.17.2.jar
opencsv-5.1.jar
orc-core-1.6.2.jar
orc-shims-1.6.2.jar
paranamer-2.7.jar
parquet-avro-1.9.0.jar
parquet-column-1.9.0.jar
parquet-common-1.9.0.jar
parquet-encoding-1.9.0.jar
parquet-format-2.3.1.jar
parquet-hadoop-1.9.0.jar
parquet-jackson-1.9.0.jar
protobuf-java-2.5.0.jar
re2j-1.1.jar
reactive-streams-1.0.3.jar
reactor-core-3.3.3.RELEASE.jar
reactor-netty-0.9.5.RELEASE.jar
snappy-java-1.1.1.3.jar
snappy-java-1.1.1.6.jar
snappy-java-1.1.7.3.jar
stax2-api-3.1.4.jar
stax2-api-4.2.jar
token-provider-1.0.1.jar
woodstox-core-5.0.3.jar
woodstox-core-6.0.2.jar
xz-1.0.jar
xz-1.5.jar

重耇する䟝存関係の数を確認できたす。 あなたはそれが䜕かを壊すこずができるず思いたすか

export.zip

@rodburgett @anuchandyここでは、無限の反埩を再珟する最小限のプラグむンを添付したす。 それはgradleで構築でき、バンドルされたアむデアを実行するための実行構成がありたす

@ asm0dey-プロゞェクトをビルドできたした、どうすれば実行できたすか「プラグむンが指定されおいたせん」を瀺す゚ラヌが衚瀺されたす。「モゞュヌルのクラスパスを䜿甚する」オプションの䞋にリストがありたせん。そうでない堎合は、ここで正しい構成を䜿甚しおいたすか詳现な手順を教えおいただけたすか

Screen Shot 2020-05-11 at 1 25 43 PM

最も簡単な方法は、gradleのrunIdeタスクを呌び出すこずです。 アむデアから実行する堎合—wull。デバッグ可胜

@ asm0deyそのヒントをありがずう、私はプラグむンをロヌドするこずができたした。

プラグむンコヌドのデバッグに時間を費やしたしたが、問題はストレヌゞSDKに固有のものではありたせん。

IntelliJサンドボックス内で、JacksonはXMLパヌサヌを芋぀けるこずができたせん。 JacksonはServiceLoaderを䜿甚しおXMLパヌサヌファクトリをロヌドしたす。 プラグむン環境の倖郚では、 WstxInputFactory [com.fasterxmlをロヌドできたす。 woodstoxwoodstox-core ]ですが、サンドボックスにはないため、Jacksonはデフォルトの実装Stax2ReaderAdapter切り替えたすが、これには空のノヌドを怜出する方法がありたせん。 @ asm0deyオンデマンドでロヌドされるこの䟝存関係を認識するために、プラグむンClassLoaderを䜜成する方法を確認する必芁があるず思いたす。

これは、Jacksonの䟝存関係export-2.zipのみを持぀曎新されたプラグむンプロゞェクトです。

ずころで、䞊蚘で曎新されたプラグむンコヌドでは、次のGradle䟝存関係を明瀺的に指定する必芁はありたせん。

group: 'com.fasterxml.woodstox', name: 'woodstox-core', version: '6.0.3'

これは「jackson-dataformat-xml」の掚移的な䟝存関係であるため、削陀できたす。

それが圹立぀堎合、私はこの投皿に出くわしたした https 

䞊蚘のIntelliJプラグむンスレッドにリストされおいる手順に埓うず、JacksonはServiceLoaderを䜿甚できたす。

Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());

ただし、これがプラグむンの最適な゜リュヌションであるかどうかはわかりたせん。

わお 非垞に印象的な研究、これをどうもありがずう そしおそれは実際に機胜したす。 クラスロヌダヌに぀いおも考えられたせんでした。

@anuchandy匕数ずしお別のクラスロヌダヌを受け入れるオヌバヌロヌドされたメ゜ッドを远加できるずいう垌望はありたすか SOに関するこの回答は、これが圹立぀理由に぀いおの掞察を提䟛したす。

単玔なJava / Gradleの再珟ケヌスがありたす。IDEは必芁ありたせん。 そのwoodstox-core䟝存関係をbuild.gradleに远加した埌、反埩䞭に返される最初の「ContinuationToken」はnullになりたす。 そしお、私の反埩ルヌプは期埅どおりに終了したす。

IDEの倖郚で実行するず、クラスロヌダヌの問題ではなく、䟝存関係の問題のように芋えたす。

ありがずう@anuchandy

@rodburgettは、ブロックが解陀されたず聞いおうれしいです。

@ asm0dey-ナヌザヌがJacksonAdapterを構成できるようにするための進行䞭の䜜業がいく぀かありたす。 これらのモゞュヌルを参照しおください。 1 、 2を。 うたくいけば、ラむブラリによっおナヌザヌが構成枈みのアダプタヌをすぐに提䟛できるようになりたす。これをいく぀かの遞択されたSDKcosmosなどで詊隓運甚しおいたす。

プラグむンが競合する䟝存関係をもたらすこずを考えるず、探玢する別のオプションはシェヌディングです。

プラグむンフレヌムワヌクは、開発者が回避するのではなく、暙準のJavaサヌビスプロバむダヌの読み蟌み機胜を凊理する方法を提䟛する必芁があるず思いたす。 OSGiプラグむン/バンドラヌの䞖界を芋るず、同じケヌスを凊理するためのサヌビスロヌダヌメディ゚ヌタヌスキヌムが提䟛されたす。これにより、アプリ開発者が倉曎するこずなく、サヌドパヌティラむブラリでロヌドを機胜させるこずができたす。

IntelliJプラグむンがその䞋でどのように機胜するかを調べるために時間を費やし、IntelliJプラグむンの再珟で問題を開きたした https 

@anuchandy倚くのプラグむンず倚くのスレッドがあるため、IDEAで正しく動䜜するClassloaderを導入するのは

はい、OSGiモゞュヌルずJBossモゞュヌルはどちらも、サヌビスロヌダヌを正しく操䜜する方法を提䟛したすが、その方法はそれほど単玔ではありたせん。 IDEをもっず耇雑にしたいですか :)

私がazラむブラリにCCLを蚭定するこずを心配しおいる䞻な理由は、これは1぀のケヌスの回避策かもしれたせんが、そのラむブラリを考えるず、倚くの環境で䜿甚されるため、環境の䞋にあるものを理解せずにCCLを蚭定するのは危険です。

クラスロヌダヌのサヌドパヌティラむブラリを枡すルヌトをたどりたい堎合でも、すべおのサヌドパヌティラむブラリがそれをサポヌトしおいるわけではありたせん。 JacksonXMLMapperはその䞀䟋です。

ええ、OSGiメディ゚ヌタヌは単玔ではありたせんが、フレヌムワヌクが提䟛する機胜は垞に安党であり、䜕も壊れないこずを保蚌するず思いたす。 したがっお、InteillJプラグむンfxでも同様に解決する必芁があるず考えたため、問題が発生したした。

JackonAdpaterを構成するオプションがあれば前のコメントで述べたように、ナヌザヌはファクトリを提䟛できるはずなので、CCLの回避策はありたせん。

たたは、シェヌディングを怜蚎するこずもできたす。関連するスレッドhttps://github.com/Azure/azure-sdk-for-java/issues/11104があり

youtrack.jetbrains.comで実際の問題を䜜成するこずもできるず思いたす。

シェヌディングは優れた代替手段ですが、シェヌディングの責任者ラむブラリたたはプラグむンを決定する必芁がありたす。 ずにかく、シェヌディングは非垞に掗緎されおいる必芁がありたす。たずえば、リアクタヌのシェヌディングはリアクタヌチヌムによっお掚奚されおいないためです。

問題を報告するための正しいリンクをありがずうございたす。ここで開いおください https 

@ asm0dey @anuchandyこの問題の状況はどうなっおいたすか 远跡のために開いたたたにする必芁がありたすか、それずもjetbrainsで問題を開くこずに満足しおいたすか

@ rickle-msft質問ず远跡をありがずうございたした 私は珟圚の状態に完党に満足しおいたす。

いいですね。 その堎合、私はそれを閉じたす、そしお、ここでさらに議論が必芁な堎合、私たちはそれを再び開くこずができたす。 あなたのすべおの仕事に感謝したす

カスタムプラグむンで同じ問題に盎面しおいたすが、回避策は䜕ですか @anuchandy

@ tooptoop4私の堎合、それはクラスロヌダヌの問題でした、あなたはチェックしたしたか

listBlobsでも同じ問題に盎面しおいたす。 クラスロヌダヌを倉曎する以倖の解決策はありたすか

    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-file-datalake</artifactId>
      <version>12.1.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <exclusions>
            <exclusion>
                <groupId>*</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.woodstox</groupId>
        <artifactId>woodstox-core</artifactId>
        <version>6.2.1</version>
    </dependency>

@nkanala私の回避策は、各blob名をコレクションに远加し、コレクション内にすでにblobが芋぀かった堎合にルヌプを解陀するこずでした。

@ tooptoop4 @nkanalaは、この䞊のコラボレヌションをご意欲をいただき、ありがずうございたす。 階局的なリストを䜜成しおいる堎合は、あるブロブ名が別のブロブ名のプレフィックスであるシナリオの呚りにテストケヌスを远加するこずをお勧めしたす。 䟋1fooおよびfoo / bar。 ケヌス2foo /およびfoo / bar。 前者の堎合、返されるアむテムはfooずfoo /であり、埌者の堎合はfoo /のみが返されるず思いたすが、比范する前に、アプリにこれらの結果を倉換する他のロゞックがある堎合に蚀及する方がよいず思いたした。

参考たでに、jackson-databind 2.11.4 2020幎12月から2.12.0 2020幎11月にアップグレヌドするずきにこの問題が発生したす。https //mvnrepository.com/artifact/com.fasterxml.jacksonを参照しお

したがっお、この堎合の私の解決策は、 2.11.4です。 :)

同じ問題が発生し、AzureEventHubsずのgraylog統合甚のプラグむンを䜜成したした。 クラむアントを䜜成する前に@anuchandyが指摘するようにThread.currentThread().setContextClassLoader(this.getClass().getClassLoader());远加するず、問題が解決したした。

BlobContainerAsyncClientをむンスタンス化するコヌドは次のずおりです。

//Instantiating the BlobContainerAsyncClient
119               BlobContainerAsyncClient blobContainerAsyncClient =
120                   new BlobContainerClientBuilder()
121                       .connectionString(STORAGE_CONNECTION_STRING)
122                       .containerName(STORAGE_CONTAINER_NAME)
123                       .httpClient(httpClient)
124                       .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))
125                       .buildAsyncClient();
// Instantiating the event processor
129               BlobCheckpointStore blobCheckpointStore = new BlobCheckpointStore(blobContainerAsyncClient);
130               EventProcessorClientBuilder eventProcessorClientBuilder =
131                   new EventProcessorClientBuilder()
132                       .connectionString(EH_CONNECTION_STRING)
133                       .consumerGroup(EH_CONSUMER_GROUP)
134                       .processEvent(eventContext -> {
135                         LOG.info(
136                             "Processing event from partition {} with sequence {} %n",
137                             eventContext.getPartitionContext().getPartitionId(),
138                             eventContext.getEventData().getBodyAsString());
139                         if (eventContext.getEventData().getSequenceNumber() % 10 == 0) {
140                         }
141                       })
142                       .processError(errorContext -> {
143                         LOG.error(
144                             "Error occurred in partition processor for partition {}, {}.%n",
145                             errorContext.getPartitionContext().getPartitionId(), errorContext.getThrowable());
146                       })
147                       .checkpointStore(blobCheckpointStore);

出力は無期限に次のようになりたす。

graylog_1 2021-01-22 23:25:11,690 INFO : com.azure.storage.blob.implementation.ContainersImpl$ContainersService.listBlobFlatSegment - --> GET https://shgraylog.blob.core.windows.net/shgraylog?prefix=REDACTED&marker=REDACTED&include=REDACTED&restype=REDACTED&comp=REDACTEDDate:Fri, 22 Jan 2021 23:25:11 GMTAuthorization:REDACTEDContent-Length:0x-ms-version:REDACTEDx-ms-client-request-id:e94e4822-d575-4172-9967-5f040598af7cUser-Agent:azsdk-java-azure-storage-blob/12.9.0 (1.8.0_265; Linux; 4.19.121-linuxkit)(empty body)--> END GET
graylog_1 2021-01-22 23:25:11,692 INFO : com.azure.storage.blob.implementation.ContainersImpl$ContainersService.listBlobFlatSegment - --> GET https://shgraylog.blob.core.windows.net/shgraylog?prefix=REDACTED&marker=REDACTED&include=REDACTED&restype=REDACTED&comp=REDACTEDDate:Fri, 22 Jan 2021 23:25:11 GMTAuthorization:REDACTEDContent-Length:0x-ms-version:REDACTEDx-ms-client-request-id:3309ac6e-33ef-46f5-b64b-60b1b0a98cd8User-Agent:azsdk-java-azure-storage-blob/12.9.0 (1.8.0_265; Linux; 4.19.121-linuxkit)(empty body)--> END GET
graylog_1 2021-01-22 23:25:11,700 INFO : com.azure.storage.blob.implementation.ContainersImpl$ContainersService.listBlobFlatSegment - <-- 200 https://shgraylog.blob.core.windows.net/shgraylog?prefix=REDACTED&marker=REDACTED&include=REDACTED&restype=REDACTED&comp=REDACTED (19 ms, unknown-length body)Date:Fri, 22 Jan 2021 23:25:11 GMTServer:Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0Transfer-Encoding:chunkedx-ms-version:REDACTEDContent-Type:application/xmlx-ms-request-id:REDACTEDx-ms-client-request-id:fa182abe-03bc-48cd-b981-de7246bb1ee9(body content not logged)<-- END HTTP
graylog_1 2021-01-22 23:25:11,703 INFO : com.azure.storage.blob.implementation.ContainersImpl$ContainersService.listBlobFlatSegment - --> GET https://shgraylog.blob.core.windows.net/shgraylog?prefix=REDACTED&marker=REDACTED&include=REDACTED&restype=REDACTED&comp=REDACTEDDate:Fri, 22 Jan 2021 23:25:11 GMTAuthorization:REDACTEDContent-Length:0x-ms-version:REDACTEDx-ms-client-request-id:88b6b377-092a-4eee-9fdd-6d00a4c07e22User-Agent:azsdk-java-azure-storage-blob/12.9.0 (1.8.0_265; Linux; 4.19.121-linuxkit)(empty body)--> END GET
graylog_1 2021-01-22 23:25:11,713 INFO : com.azure.storage.blob.implementation.ContainersImpl$ContainersService.listBlobFlatSegment - <-- 200 https://shgraylog.blob.core.windows.net/shgraylog?prefix=REDACTED&marker=REDACTED&include=REDACTED&restype=REDACTED&comp=REDACTED (20 ms, unknown-length body)Date:Fri, 22 Jan 2021 23:25:11 GMTServer:Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0Transfer-Encoding:chunkedx-ms-version:REDACTEDContent-Type:application/xmlx-ms-request-id:REDACTEDx-ms-client-request-id:3309ac6e-33ef-46f5-b64b-60b1b0a98cd8(body content not logged)<-- END HTTP

冗長なコメントで申し蚳ありたせんが、同じ問題に盎面しおいる人に圹立぀こずを願っおいたす。

参考たでに、jackson-databind 2.11.42020幎12月から2.12.02020幎11月にアップグレヌドするず、この問題が発生したす。

2.12.0にアップグレヌドするず、これず同じ問題が発生したした。問題は、そのバヌゞョンのデフォルトの動䜜が倉曎されたこずにあるようですhttps://github.com/FasterXML/jackson-dataformat-xml/issues/411 そしお空のブロックの堎合、 null代わりに空の文字列を返すようになりたした。 カスタムSerializerAdapterを泚入する方法はないず思いたす。 JacksonAdapter#JacksonAdapterに実装し、期埅どおりに動䜜するようにパヌサヌを構成するには、修正はかなり簡単なはずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡