导言
我们都知道,如果我们使用多映射,我们不能用动态配置来设置动态文件名和文件夹,因为所有消息共享同一个头,最近有很多线程询问这个要求,如果变量替换中使用的字段是目标负载的一部分,全民淘客,那么动态文件名或文件夹不是问题,只有那些字段不是目标负载的一部分,那么我们不能使用变量替换动态文件名和文件夹,但在本博客中,我将向您展示如何使用变量替换来实现这一点。
方法
我们将在目标结构下添加单独的节点来保存变量替换中使用的字段和这些字段不是目标文件的一部分,大数据指的是什么,我们将为此节点使用以下内容转换参数,然后文件适配器将在运行时忽略此记录。
场景
场景是我们得到一条包含多个订单的消息,我们需要在目标端生成多个文件,每个文件包含一个订单。我们需要根据源消息中的plant字段创建动态文件夹,我们需要创建带有IDoc编号的动态文件名。
设计
下面是本场景中使用的发送方和接收方数据类型,为了简单起见,我为IDoc创建了自己的数据类型,我在目标结构下添加了名为'file'的单独节点,FileName(此字段用于动态文件名)和plant(此字段用于动态文件夹)是此节点下的字段,这些字段将用于目录中接收器文件通道中的变量替换。
由于我们正在从单个IDoc创建多个文件,我们需要将接收器消息的出现更改为映射的无界签名部分。
下面是源消息和目标消息之间的映射,所有字段都是简单的字段到字段映射,我们将在源消息中接收多个IDOC节点,我正在目标端创建多个StockOrder节点。DOCNUM(Idoc number)和WERKS我没有传递到目标文件,我们需要这些字段来设置动态文件名和文件夹,所以我们需要在目标结构的文件节点下映射这两个字段。
下面是文件名字段映射,IDoc编号以".txt"扩展名连接。
配置
下面是接收文件通信通道配置、目标目录和目标文件名,其中变量在变量替换部分创建。
下面是接收文件的内容转换,因为我们不需要将文件节点下的字段发送到目标文件我们需要使用下面的参数来忽略目标文件中的这些字段。
下面是我们在目标目录和文件名中使用的'fname'和'plant'变量。
测试结果
下面是输入有效负载,有两个具有相同plant(3204)的idoc,因此最后我们需要两个动态文件夹。
下面是消息监视器中有四条消息,一条用于发送者到消息系统,消息传递系统到接收器的三条消息(根据我们的多重映射,一个文件分为三条消息)
我们可以看到IDoc编号和工厂编号映射到目标负载的文件节点下。
我们可以在审计日志中看到变量plant和IDoc编号在运行时被替换。
正如我们预期的那样,在下面创建的两个文件夹目标目录
我们可以在3204目录下找到两个文件(源文件包含两个IDoc,大数据分享,淘客返利,同一工厂3204)
下面的一个文件内容,我们可以看到IDoc编号和工厂值不是文件的一部分,仅包含订单的标题和项目。
和3205文件夹下的一个文件。
引用
一种新方法:使用通用自定义模块的多映射动态配置
具有动态配置的多映射-SOAP环回方法
结论
使用这种方法,即使我们使用多重映射,我希望这将是有益的。
很好的博客。很好的解释。谢谢。
好的一个Praveen….谢谢分享
非常好,非常有用的博客。
嗨Praveen,
很好的技巧配置FCC参数忽略额外的记录类型!谢谢分享。
关于这个的一些限制的一些想法-你能确认吗?
-仅适用于接收通道中使用FCC的场景,返利折扣,因此目标XML有效负载不能使用此
-如果我没弄错的话,如果FCC是通过模块(即MessageTransformBean)实现的,那么它将不起作用,因为在这些情况下变量替换将不起作用(例如SFTP文件内容转换)错误:变量替换无法解析消息xml:prolog中不允许内容。)
Rgds
Eng Swee
Hi Eng,
感谢您的评论,是的,这不会如果我们使用FCC模块就可以了,但是SFTP适配器也包含了与文件适配器相同的FCC,所以我们不需要在SFTP适配器中使用FCC模块。
问候,
Praveen。
非常好和有用的博客。