当前位置: 首页 > 知识库问答 >
问题:

另一条路线中的Apache camel blueprint web服务响应

南门欣怡
2023-03-14

我在 apache Camel 中构建了一个 Web 服务,作为 karaf 上的捆绑包运行,它接受请求并将信息保存在数据库中。

之后,另一个包获取这个插入的记录,修改数据并将其保存回数据库。

现在我需要原始请求的响应来包含修改后的数据,因此除了如下所示的 Web 服务的路由之外

<route id="cxf">
    <from uri="cxf:bean:getHopEndpoint" />
    <recipientList>
        <simple>direct:${header.operationName}</simple>
    </recipientList>
</route>
<route id="getHop">
    <from uri="direct:getHop" />
    <process ref="getHopToDbProcessor" />
    <to
        uri="sql:INSERT INTO myTable (field1, field2) VALUES (:#field1, :#field2)"/>
</route>

我还需要一个这样的

<route id="cxfResponse">
    <from uri="sql:SELECT * FROM myTable"/>
    <!-- to web service response in any way -->
</route>

有什么办法可以做到这一点?

共有2个答案

涂浩皛
2023-03-14

我找到了另一个解决方案:我正在使用直接 VM 组件。我的路由现在如下所示:

捆绑1接收web服务请求并将数据保存在数据库中:

<route id="cxf">
    <from uri="cxf:bean:getHopEndpoint" />
    <recipientList>
            <simple>direct:${header.operationName}</simple>
    </recipientList>
</route>
<route id="getHop">
    <from uri="direct:getHop" />
    <process ref="getHopToDbProcessor" />
    <to uri="sql:INSERT INTO myTable (field1, field2) VALUES (:#field1, :#field2)" />
    <to uri="direct-vm:processHop" />
</route>

在处理我刚才插入的数据的捆绑包2中:

<route>
    <from uri="direct-vm:processHop"/>
    <to uri="sql:SELECT * FROM myTable WHERE processed = false" />
    <process ref="getHopComputopUrlProcessor" />
    <to uri="sql:UPDATE webshop_gethop_requests SET new_data = :#newData, processed = true WHERE some_id = :#someId" />
    <to uri="direct-vm:response"/>
</route>

然后再次返回bundle 1以发送带有处理后数据的响应:

<route>
    <from uri="direct-vm:response" />
    <to uri="sql:SELECT some_id,new_data FROM myTable WHERE some_id = :#someId AND processed = true" />
    <process ref="getHopResponseProcessor" />
</route>

这对我来说很好:)

葛海阳
2023-03-14

作为第一条路线的最后一步,您必须将身体设置为所需的响应。无法将响应设置在此路由之外。

所以我认为有两种方法可以解决你的问题。

  1. 以同步方式在第一条路由内完成所有需要做的事情
  2. 将服务更改为完全异步

对于变体 2,您可以使用像 jms 这样的消息传递,也可以为第一次调用提供一个 Web 服务 uri 来回调。

如果您的服务负载很高,完全异步的方法可能会使您的系统工作得更好。

 类似资料:
  • 我有一个要求,其中,作为Web服务[Java]的一部分,我将作业的详细信息输入数据库,数据库由Windows服务[C#]异步处理,并对Javaweb服务通知作业的状态。 情景: 客户端对JavaWeb服务进行同步Restful调用。 JavaWeb Service将作业详细信息输入数据库(类似于进行异步调用),并等待Windows Service的响应(这是对JavaWeb Service的新HT

  • 我有以下服务: 和其他服务 我有我的Junit 当我在调试模式下运行这个测试时,我看到这个。合同服务。getInfo(multipartFileId) 正在返回我“null”。 我在嘲弄中错在哪里。 我刚刚在JUnit中嘲笑了ContractService。我还需要模拟AccountServiceImpl吗? 编辑:添加saveInCache和getInfo方法

  • 问题内容: 是否可以在angularJS中将一个服务注入到另一个服务中? 问题答案: 是。遵循angularjs中的常规注入规则。 感谢@simon。最好使用数组注入以避免最小化问题。

  • 我使用Reavt V6路由。 我正在努力让我的路线在游戏组件中工作。 在完全空白的页面中查看/测试结果。而它应该在gamecomponent中加载犯罪模块。访问/呈现gamecomponent,但/test不会呈现gamecomponent及其内部的路由。 我怎样才能让它工作? 访问url/crime会导致被加载,并且 应该上膛了。 app.js 专用路线: 游戏成分:

  • 问题内容: 是否可以在python中使用一行命令来做一个简单的ftp服务器?我希望能够以这种快速和临时的方式来执行此操作,而无需将FTP服务器安装到Linux机器上。最好是使用内置的python库的方法,因此无需额外安装。 问题答案: 强制性扭曲示例: 可能有用:

  • 我正在使用空手道版本0.8.0.1,我想执行以下步骤来测试一些响应。 > 使用jsonpath从web服务1的响应中查找货币值: