【问题标题】:why call is not working in wso2 esb为什么调用在 wso2 esb 中不起作用
【发布时间】:2017-06-15 13:12:47
【问题描述】:

我对 wso2 esb 有疑问。 我编写了一个代理,并调用了一个端点来对原始输入进行一些更改。但是通话前后的日志是一样的(应该是不同的)。看来通话根本不起作用。当我向外序列发送响应时,它为空。谁能说出为什么会这样? (我已经在soupUI 中测试了我的端点)

这是我的代理:

      <inSequence>
     <property name="transport.vfs.ReplyFileName" value="GET" scope="transport"/>
     <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
     <smooks config-key="smooks-csv1">
        <input type="text"/>
        <output type="xml"/>
     </smooks>
     <iterate continueParent="true"
              preservePayload="true"
              attachPath="//csv-set"
              expression="//csv-set/search"
              sequential="true">
        <target>
           <sequence>
              <xslt key="gov:/first.xsl"/>
              <xslt key="gov:/second.xsl"/>
              **<log level="full"/>
              <call blocking="true">
                 <endpoint>
                    <address uri="MyEndPiont"/>
                 </endpoint>
              </call>
              <log level="full"/>**
           </sequence>
        </target>
     </iterate>
     <respond/>
  </inSequence>
  <outSequence>
     <aggregate>
        <completeCondition>
           <messageCount min="0" max="100"/>
        </completeCondition>
        <onComplete expression="//Guest">
        </onComplete>
     </aggregate>
  </outSequence>

【问题讨论】:

    标签: wso2 call esb mediator


    【解决方案1】:

    试试这个。变更清单:

    • 已删除 respond 调解员。
    • call 替换为send
    • 按顺序添加了send

        <inSequence>
           <property name="transport.vfs.ReplyFileName" value="GET" scope="transport"/>
           <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
           <smooks config-key="smooks-csv1">
              <input type="text"/>
              <output type="xml"/>
           </smooks>
           <iterate continueParent="true"
                    preservePayload="true"
                    attachPath="//csv-set"
                    expression="//csv-set/search"
                    sequential="true">
              <target>
                 <sequence>
                    <xslt key="gov:/first.xsl"/>
                    <xslt key="gov:/second.xsl"/>
                    <log level="full"/>
                    <send>
                       <endpoint>
                          <address uri="MyEndPiont"/>
                       </endpoint>
                    </send>
                 </sequence>
              </target>
           </iterate>
        </inSequence>
        <outSequence>
           <aggregate>
              <completeCondition>
                 <messageCount min="0" max="100"/>
              </completeCondition>
              <onComplete expression="//Guest">
              </onComplete>
           </aggregate>
           <send />
        </outSequence>
      

    【讨论】:

    • 不幸的是,再次进行这些更改后,我看不到顺序输出。它给了我这个错误:“错误 - 附加 VFS 文件系统属性时出现 VFSTransportSender 错误。null 错误 - VFSTransportSender 无法确定要发送消息的传输信息”。我该怎么办?提前致谢
    • 您可以尝试删除OUT_ONLY 属性吗?
    • 删除这个我可以看到结果。但它给了我一个错误,因为我使用 VFS,这是异步的。在发送部分,我将响应写入文件。这是错误:“VFS 传输不支持同步响应。请使用适当的(仅输出)消息交换模式”
    • send 部分是什么意思?
    • 我应该将结果发送到文件中。这是我聚合后的代码:“
      "
    【解决方案2】:

    试试blocking="false"。请注意,进行此更改不会使呼叫中介是异步的。无论阻塞是真还是假,它都是同步的。阻塞只是一个实现细节。

    调用中介器用于将消息从 ESB 发送到 端点。您可以以阻塞或非阻塞方式调用服务 方式。

    当您以非阻塞模式调用服务时,底层工作人员 线程不等待响应就返回。在阻塞模式下, 底层工作线程被阻塞并等待响应 将请求发送到端点。阻塞模式下的呼叫中介是 非常类似于 Callout 中介。

    在阻塞和非阻塞模式下,调用中介器的行为都是 同步方式。因此,调解在服务之后暂停 调用并从序列中的下一个中介继续,当 收到响应。呼叫调解器允许您创建您的 配置独立于底层架构。

    引自https://docs.wso2.com/display/ESB500/Call+Mediator

    【讨论】:

    • 启用有线日志并查看。 lakshanigamage.blogspot.com/2015/03/…
    • @Bhathiya 非常感谢你。现在我可以在控制台中看到所需的输出。但为什么在正常情况下我看不到结果?如何保存此结果?
    • 当我启用连线日志时,我可以看到正确的输出。你能告诉我为什么会这样吗?如何保存结果?为什么响应不发送任何内容到序列?
    • 启用连线日志与功能没有任何联系。您可以禁用它并再次尝试确认。也许您的更改在重新启动后已正确部署。我刚刚注意到你使用了respond 调解器,你不能在这里使用它。我将在这里发布另一个答案。试试看。
    猜你喜欢
    • 1970-01-01
    • 2015-05-31
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多