【问题标题】:Mule 3.4 - scripting in PythonMule 3.4 - 用 Python 编写脚本
【发布时间】:2013-07-23 14:33:41
【问题描述】:

我在 Mule 中开始编写脚本时遇到了很多麻烦。老实说,我遇到了第一个障碍——我在文档中找不到任何东西告诉我如何访问有效负载或如何将数据返回到我的流程中。

我正在使用 Jython 2.5 和 Mule 3.4。

我的流程非常简单:它从 Ajax 源中获取一些文本并简单地回显它。目前 Python 脚本什么都不做(因为我不知道如何让它对有效负载做一些事情)。

<flow name="Python Script" doc:name="Python Script">
    <ajax:connector name="connector-ajax" serverUrl="http://192.168.0.1:8000" resourceBase="C:\mule\workspace\scripting\src\main\app\docroot" doc:name="Ajax" />
    <scripting:component doc:name="Python">
        <scripting:script engine="jython" file="C:\mule\workspace\scripting\src\main\app\python\myscript.py"/>
    </scripting:component>
    <echo-component doc:name="Echo"/>
</flow>

我已通读 Script Component ReferenceScripting Module Reference - 模块参考似乎有一些相关信息,但我不知道如何在 Python 中使用它。

我还阅读了一篇关于“Mule Punching”的文章,如果我运行的是 Mule 的第 2 版,它似乎可以回答我的问题。我尝试在我的 Mule 3 项目中使用相同的技术,但没有成功。

编辑 24/07/2012

使用@ppiixx 的回复,我对 Python 脚本有了更深入的了解。

仅仅只有一行代码,例如return len(payload) 会导致Jython 解释器抛出错误,因为return 不能存在于函数之外。很公平,这是标准。

但是,用代码

def main():
  return len(payload)

main()

我收到一条错误消息,提示“找不到类 org.mule.transport.NullPayload 的序列化程序”。

日志如下:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Started app 'python-test'                                +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INFO  2013-07-24 09:16:08,821 [[python-test].flow.stage1.02] org.mule.component.simple.LogComponent: 
********************************************************************************
* Message received in service: flow. Content is: '{NullPayload}'               *
********************************************************************************
ERROR 2013-07-24 09:16:08,849 [[python-test].flow.stage1.02] org.mule.exception.CatchMessagingExceptionStrategy: 
********************************************************************************
Message               : No serializer found for class org.mule.transport.NullPayload and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (org.codehaus.jackson.map.JsonMappingException)
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. No serializer found for class org.mule.transport.NullPayload and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (org.codehaus.jackson.map.JsonMappingException)
  org.codehaus.jackson.map.ser.impl.UnknownSerializer:52 (null)
2. No serializer found for class org.mule.transport.NullPayload and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (org.codehaus.jackson.map.JsonMappingException) (org.mule.api.transformer.TransformerException)
  org.mule.module.json.transformers.ObjectToJson:107 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerException.html)

这让我认为单独使用return 不足以将数据返回到流中。

我已经通读了脚本模块参考,虽然它给出了 Groovy 中的示例,但它没有给出 Python 中的示例,所以我不确定我哪里出错了。

【问题讨论】:

    标签: python jython mule esb


    【解决方案1】:

    查看“脚本上下文绑定”部分here

    脚本上下文中基本上有许多变量可用,包括:消息、有效负载和日志。

    要使用 python 引擎返回数据,您需要设置结果变量。

    result = len(payload)
    

    在mule github中有一个example

    【讨论】:

    • 感谢您的回复。我再次通读了脚本模块参考,在您的帮助下我得到了进一步的帮助,但仍然没有设法将任何数据返回到我的流程中。我已经更新了这个问题 - 你介意再看一下吗?
    • 在这里尝试一下,看起来您只需将结果变量设置为您要返回的数据。
    • 使用result = len(payload) 确实给了我有效载荷的大小!诚然,我没有使用这种将数据返回到流的方式,因为文档说直接返回数据更好,但显然这在 Python 中不起作用。非常感谢,你真的帮助了我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多