`

mule in action翻译11 : 2.3 Mule 消息

    博客分类:
  • ESB
阅读更多

 

mule in action翻译11 : 2.3  Mule 消息

 

2.3  Mule 消息

 

 当一个消息传入mule, 它实际上是触发了一个事件(例如,可能是org.mule.api.MuleEvent的一个实例)。

 这个事件不仅携带实际的消息本身(例如 一个org.mule.api.MuleMessage实例),而且还包含消息处理时

 用到的上下文信息。 

 事件的上下文由多个不同对象的引用组成,包括安全证书(如果有的话)、处理请求的会话信息和mule的全局上下文信息。 通过上下文可以访问mule的所有内部构件。如图2.7所示 。

 

 

 

 

 mule消息由不同的部分组成,如图2.8



 

 1、payload     消息携带的主要内容数据

                         --感觉一个消息就像个拉集装箱的大货车,payload就是大货车拉的集装箱。

 2、properties  包含消息的元数据信息

 3、attachments 这部分是可选的且形式多样,用来支持多段消息(multipart messages)

 4、exception payload  这部分是可选的, 用来保存事件处理过程中发生的任何的错误。

 

 消息一般由消息源创建。当消息源接收到一个进入事件(如一个HTTP请求或进来一个JMS消息)或者

 成功的轮询了资源(如一个文件系统或一个数据库)都会创建新的消息。

 消息也可以通过编程的方式创建。

 

 

 线程安全  默认mule保证在任意一个时间点只有一个线程可以修改消息。

            线程间传递消息的常用的方式是消息复制。

 

 

 图2.9展示了HTTP和email 的消息源创建的消息 。

 

 

 如图2.9所示,消息payload的java 类型取决于消息“出身”。

 byte数组,java.io.InputStream的实现类类型,或者字符串,是常见的payload类型。

 一些特殊的payload类型,如 java.io.File对于File传输,也可以由mule消息进行传输。

 payload不会捕获到整个事件的上下文信息,并在mule中传播。消息属性properties登场了。

 

 2.3.1 消息属性(Message properties )

 

  消息属性是元数据 ,提供mule携带的payload的上下文数据。

  生成消息(典型的由是inbound endpoint生成)时会自动生成这些元信息。

  当mule分发消息(典型是由outbound endpoint发出)到一个特定目的地时, 也会读取消息属性。

  在消息处理过程中 或 进行消息路由时都会使用到消息属性。

  

  消息属性有一个名字(String),一个值(object)和一个范围(enumeration)组成。

  消息属性包含下面消息:

  1、 一般的传输的元消息   保存在消息属性。想想 http请求头,或JMS的消息属性。

                          一些传输协议如TCP ,不会创建任何的元信息。

  2、 mule特定的传输元信息   用来存储上下文信息。例如 mule收到所有的HTTP请求的请求路线

                             会以 http.request.path的名字保存起来。

  

  

  mule的多数消息传输过程都有outbound endpoints 。这些outbound endpoints对消息属性是“敏感”的。

  例如SMTP传输会自动识别和发送email所需要的元信息相关的所有的 消息属性,如subject或toAddresses。

  

  传输属性  一些传输对属性名字有要求。若你试图使用不符合JMS规范的属性时, 它会进行明确的提示。

  

  不幸的是,并没有一个权威的包含所有属性的列表; 对每个协议你都需要查阅其在线文档。

  另外,我们建议在开发模式下使用logger消息处理器,以显示传输用到的属性消息。

  

  2.3.2 理解属性作用域(property scopes)

  属性在一个范围内有效,但在另一个范围内是无效的。

  这意味着,消息属性不像payloads那样,它在mule内不会一直被自动携带。

  这个“范围”是有边界的,属性并不会被一直传递下去。

  这是边界是如何定义的?

  

  流定义了属性作用域的边界。更确切的说,流的inbound endpoints 和 outbound endpoints 是消息属性传递的边界。

  图2.10 说明了不同的属性作用域 以及相关的边界。

  

 

  

  四种作用域的属性 :

  1、Inbound property     由消息源创建, 这些属性对最终用户是只读的。

                                        Inbound properties可以被outbound endpoints清除;发生这种情况时,

                                       你需要修改你的程序了。

  2、Outbound property  使用set-property, message-properties-transformer 创建,

                                       需要指定scope是outbound 。

                                      也可通过编码创建。

                                      Outbound property由outbound endpoints进行识别。

  3、Invocation property   使用 set-variable, message-properties-transformer创建,

                                        需要指定scope是invocation。

                                       或通过编码生成。

                                       Invocation property主要作为流变量。

  4、Session property   由消息源创建 ,

                                     使用 set-variable, message-properties-transformer 创建,

                                     需要指定scope是session。

                                     也可通过编码创建。

                                      这个作用域一定是对于"飞着的消息"使用(没看明白原文:

                                        this scope is bound to the in-flight message),

                                        可以跨多个流(想一下java的threadlocal 机制,这里差不多是MessageLocal)

                 

 

    边界交叉   跨作用域时使用 copy-properties元素来复制属性,

                    例如传递一个 inbound property 到 outbound property , 或存储到一个 会话作用域。

 

 

目前为止我们只是关注请求阶段的属性。响应阶段是什么样 ?在响应阶段是反过来的。

Inbound endpoints查找outbound作用域的属性,去传递给调用者。

请求-响应的outbound endpoints创建inbound属性 。

只有流和会话变量的行为 在请求和响应阶段都是相同的,

只要它们被保存下来且在消息处理过程中国没有被影响。

 

列表2.11 展示了 在响应阶段怎么设置HTTP content-type。

如何创建一个属性,才能在inbound endpoint返回给调用者时使用?

秘密在于set-property创建了 outbound 作用域的属性。

 

Listing 2.11 Adding a header to the outbound scope adds it to the response

<flow name="responseHeader">
        <http:inbound-endpoint exchange-pattern="request-response"
                                           host="localhost"
                                           port="8080"
                                           path="json/data" />
        <component class="com.prancingdonkey.data.JsonDataFetcher" />
        <response>
              <set-property propertyName="Content-Type" value="application/json" />
        </response>
     </flow>

 

 

 

   响应阶段属性的传递  在响应阶段要把一个消息属性从一个outbound endpoint返回给调用

                       inbound endpoint 的调用者,需要把它从inbound拷贝到 outbound 。

   

   

   看另外一个设计多个作用域的例子。列表 2.12显示了一个接受用户输入xml的例子。

   它使用XPath表达式 提取出ID ,并保存为一个名字为useId的流变量。

   这个流变量随后有两个地方使用:

         在一个HTTP outbound endpoint使用它创建一个 REST 资源URI。

         在响应添加一个名字为 X-User-ID的属性。 

 

  Invocation scope在响应阶段仍是有效的。

  在inbound阶段设置的流变量在响应阶段仍然有效。

 

Listing 2.12 A flow that sets a variable and uses it in two places

<flow name="flowVarPersistence">
     <vm:inbound-endpoint path="user.fetch" exchange-pattern="request-response" />
     <response>
         <set-property propertyName="X-User-ID" value="#[userId]" />
     </response>
     <set-variable variableName="userId" value="#[xpath('/user/@id').value]" />
     <http:outbound-endpoint address="http://${internalApiBaseUri}/api/users/#[userId]"
                              method="GET"
                     exchange-pattern="request-response" />
</flow>

 

 

  可访问但不拥有    尽管流变量和会话变量都可被mule消息的属性访问器访问,

                              但他们实际上却是属于mule的Event 和 Session 对象的。

                             为了方便,mule消息把其引用分享到支持这两个作用域的map中。

  

  

 

  尽管不经常使用, attachments也是 mule消息的重要成员。

  

  2.3.3 使用消息附件( message attachments)

  

  附件用来支持额外的数据,按严格语义来讲它不是元信息 ,它更像payload的替代品或补充。

  一个附件由一个名字定义、一个数据源(一个 javax.activation.DataHandler )及一个作用域 定义。

  附件的作用域限制在 inbound和outbound,和属性作用域一样有相同的流边界。

  

  附件主要用来支持inbound的email的分段消息(由POP或IMAP创建) 和

  outbound email 消息(使用 SMTP传输)。

  inbound 附件由email endpoint 直接创建,而outbound endpoint的附件需要以编程方式创建。

  

  下面的列表展示了一个流, Prancing Donkey 公司用它接收email订单。

  Listing 2.13 Extracting message attachments with an expression transformer

 

 
  <flow name="email-order-processor">
      <!-- 1  通过一个在别地配置的全局的 endpoint接收email-->
      <inbound-endpoint ref="email-orders" />
      <!-- 2  提取当前消息所有的附件 -->
      <expression-transformer expression="#[message.inboundAttachments.values()]" />
      <!-- 3  拆分附件列表到单独的每个消息-->
      <collection-splitter />
      <!-- 4  发送一个独立订单消息以进行处理-->
      <outbound-endpoint ref="pdf-orders" />
  </flow>

 

  

  

  在注释2处,这里使用表达式转换器提取所有的附件,并把当前消息的payload内容替换为所提取的附件列表

                (inboundAttachments  是 java.util.Map  --保存附件的name和value)。

  在注释1后,存储在消息payload中的消息体被丢弃,内容被替换成了附件。

  在注释3处,把附加列表拆分成独立的消息--因为允许客户在一个email中附加几个发票。

  在注释4处,上步被拆分的形成的每个消息 都将由这里调用的服务进行处理。

  

  • 大小: 16.5 KB
  • 大小: 13.3 KB
  • 大小: 33.6 KB
  • 大小: 23.6 KB
分享到:
评论

相关推荐

    Mule in Action

    ### Mule in Action:Enterprise Service Bus 实现框架 #### 一、Mule 概述 Mule 是一个轻量级的消息传递框架和高度可分布的对象代理系统,它被设计为解决企业集成问题的一个强大工具。Mule 在企业服务总线...

    pandas-1.3.5-cp37-cp37m-macosx_10_9_x86_64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.002)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于ssm框架+mysql+jsp实现的监考安排与查询系统

    有学生和教师两种角色 登录和注册模块 考场信息模块 考试信息模块 点我收藏 功能 监考安排模块 考场类型模块 系统公告模块 个人中心模块: 1、修改个人信息,可以上传图片 2、我的收藏列表 账号管理模块 服务模块 eclipse或者idea 均可以运行 jdk1.8 apache-maven-3.6 mysql5.7及以上 tomcat 8.0及以上版本

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.001)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于MATLAB车牌识别代码实现代码【含界面GUI】.zip

    matlab

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于Web的毕业设计选题系统的设计与实现(springboot+vue+mysql+说明文档).zip

    随着高等教育的普及和毕业设计的日益重要,为了方便教师、学生和管理员进行毕业设计的选题和管理,我们开发了这款基于Web的毕业设计选题系统。 该系统主要包括教师管理、院系管理、学生管理等多个模块。在教师管理模块中,管理员可以新增、删除教师信息,并查看教师的详细资料,方便进行教师资源的分配和管理。院系管理模块则允许管理员对各个院系的信息进行管理和维护,确保信息的准确性和完整性。 学生管理模块是系统的核心之一,它提供了学生选题、任务书管理、开题报告管理、开题成绩管理等功能。学生可以在此模块中进行毕业设计的选题,并上传任务书和开题报告,管理员和教师则可以对学生的报告进行审阅和评分。 此外,系统还具备课题分类管理和课题信息管理功能,方便对毕业设计课题进行分类和归档,提高管理效率。在线留言功能则为学生、教师和管理员提供了一个交流互动的平台,可以就毕业设计相关问题进行讨论和解答。 整个系统设计简洁明了,操作便捷,大大提高了毕业设计的选题和管理效率,为高等教育的发展做出了积极贡献。

    机器学习(预测模型):2000年至2015年期间193个国家的预期寿命和相关健康因素的数据

    这个数据集来自世界卫生组织(WHO),包含了2000年至2015年期间193个国家的预期寿命和相关健康因素的数据。它提供了一个全面的视角,用于分析影响全球人口预期寿命的多种因素。数据集涵盖了从婴儿死亡率、GDP、BMI到免疫接种覆盖率等多个维度,为研究者提供了丰富的信息来探索和预测预期寿命。 该数据集的特点在于其跨国家的比较性,使得研究者能够识别出不同国家之间预期寿命的差异,并分析这些差异背后的原因。数据集包含22个特征列和2938行数据,涉及的变量被分为几个大类:免疫相关因素、死亡因素、经济因素和社会因素。这些数据不仅有助于了解全球健康趋势,还可以辅助制定公共卫生政策和社会福利计划。 数据集的处理包括对缺失值的处理、数据类型转换以及去重等步骤,以确保数据的准确性和可靠性。研究者可以使用这个数据集来探索如教育、健康习惯、生活方式等因素如何影响人们的寿命,以及不同国家的经济发展水平如何与预期寿命相关联。此外,数据集还可以用于预测模型的构建,通过回归分析等统计方法来预测预期寿命。 总的来说,这个数据集是研究全球健康和预期寿命变化的宝贵资源,它不仅提供了历史数据,还为未来的研究和政策制

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    婚恋网站 SSM毕业设计 附带论文.zip

    婚恋网站 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    基于java的戒烟网站答辩PPT.pptx

    基于java的戒烟网站答辩PPT.pptx

Global site tag (gtag.js) - Google Analytics