Apache Camel如何设置ZIP压缩包内部存储的文件名称
Apache Camel ZIP压缩包内部文件名自定义方案
问题原因
当前配置中设置的FileName头仅被最终输出的file组件识别,用于命名外层ZIP包;zipfile序列化组件默认读取CamelFileName头作为包内文件名称,若该头不存在则自动使用Message ID作为内部文件名,因此解压后会出现MessageID.txt的默认命名。
解决方案
方案1:通过专用头指定内部文件名(轻量无侵入)
在marshal压缩步骤前设置CamelFileName头指定包内文件名,和外层ZIP命名的头分开配置即可。
修改后路由配置:
<to uri="amq:queue:INLET"/> <!--QUEUE TO FILE--> <!-- 设置ZIP包内部存储的文件名 --> <setHeader name="CamelFileName"> <simple>expected-inner-filename.txt</simple> </setHeader> <!-- 设置外层ZIP包文件名 --> <setHeader name="FileName"> <simple>myfilename</simple> </setHeader> <marshal> <zipfile/> </marshal> <to uri="file:C:/Target/?fileName=${header.FileName}.zip"/>
方案2:zipfile标签直接配置固定内部文件名
如果内部文件名不需要动态变化,可直接在zipfile数据格式标签上配置filename属性,无需额外设置头:
<to uri="amq:queue:INLET"/> <!--QUEUE TO FILE--> <setHeader name="FileName"> <simple>myfilename</simple> </setHeader> <marshal> <!-- 直接声明包内文件名 --> <zipfile filename="expected-inner-filename.txt"/> </marshal> <to uri="file:C:/Target/?fileName=${header.FileName}.zip"/>
方案3:动态生成内部文件名
如果内部文件名需要根据业务规则动态生成,可先将规则生成的内部文件名存入自定义头,再在zipfile配置中引用,避免和系统头冲突:
<to uri="amq:queue:INLET"/> <!--QUEUE TO FILE--> <!-- 动态生成内部文件名存入自定义头 --> <setHeader name="InnerFileName"> <simple>order-file-${date:now:yyyyMMddHHmmss}.txt</simple> </setHeader> <setHeader name="FileName"> <simple>myfilename</simple> </setHeader> <marshal> <zipfile filename="${header.InnerFileName}"/> </marshal> <to uri="file:C:/Target/?fileName=${header.FileName}.zip"/>
注意事项
- 不要在marshal压缩步骤之后修改
CamelFileName头,否则会导致压缩包内部文件名配置失效 - Camel 2.10.0及以上版本、3.x全版本均支持上述配置,低版本需先升级组件版本
内容的提问来源于stack exchange,提问作者Ravi Kishore
相关产品推荐
相关产品推荐

