簡體   English   中英

嘗試使用 Apache Camel 將文件上傳到 Amazon S3 時出現“AWS S3 密鑰標頭丟失”錯誤

[英]'AWS S3 Key header missing' error when trying to upload file to Amazon S3 Using Apache Camel

我正在嘗試使用 Apache Camel 將 csv 文件從本地目錄上傳到 AWS S3。

參考此處找到的文檔( https://camel.apache.org/staging/components/latest/aws-s3-component.html ),我嘗試創建一個像這樣的簡單路由(我當然刪除了密鑰和其他標識信息並用 [FAKE_INFO] 替換它們):

from("file:fileName=${in.headers[fileName]}")
  .to("aws-s3://[BUCKET]?accessKey=[ACCESS_KEY]&secretKey=RAW([SECRET_KEY])&region=US_EAST_2&prefix=TEST.csv");

這會導致以下錯誤:

錯誤:java.lang.IllegalArgumentException:AWS S3 Key 標頭缺少 apache camel

在網上搜索了一下之后,我刪除了傳遞的前綴,而是插入了一個 .setHeader 來路由,如下所示:

from("file:fileName=${in.headers[fileName]}")
  .setHeader(S3Constants.KEY, simple("TEST.csv"))
  .to("aws-s3://[BUCKET]?accessKey=[ACCESS_KEY]&secretKey=RAW([SECRET_KEY])&region=US_EAST_2");

這很好用,只要我願意在 setHeader 之后對所有內容進行硬編碼。 但是,對於我的特定用例,我需要從交換標頭傳遞項目以提供密鑰、存儲桶名稱和文件名(此路由由多個文件使用,這些文件根據交換標頭中收到的不同條件進入不同的存儲桶)。 出於某種原因,一旦使用 setHeader 設置 S3Constants.KEY,我就無法再訪問任何交換標頭 - 事實上,我什至無法從交換標頭分配 S3Constants.KEY 值。 如您所見, from 部分中的 fileName 是通過交換標頭分配的,我在那里沒有遇到任何問題,所以我知道它們正在被接收到路由中。

關於如何修改此路由以便我可以在沒有 S3Constants 的情況下上傳文件並在適當的情況下使用交換標頭的任何想法?

不確定我的理解是否正確,但在我看來

  • 題主的問題已經解決了
  • 你唯一的問題是你想要動態的靜態目標地址

要定義動態目標地址,有一個“ dynamic to

.toD(...)

您可以在這樣的動態目標地址中使用例如簡單的表達式

.toD("aws-s3://${in.header.bucket}?region=${in.header.region}&...")

有關更多詳細信息,請參閱Camel 文檔(“動態到”部分)。

順便說一句:您寫的是“交換標題”。 不要將Exchange 屬性消息頭混淆!

  • Exchange 屬性僅在 Exchange 包裝器上,因此在 Camel 路由完成處理后隨 Exchange 丟失。
  • 消息頭位於消息本身上,因此即使在將其路由到隊列或任何端點之后,它們仍會保留在消息中。 這也意味着標頭必須是可序列化的。
  • 您必須以不同的方式訪問這兩種類型。 例如,在簡單的你從入站消息的標題${in.header.myHeader}而你得到與Exchange屬性${exchangeProperty.myProperty}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM