【问题标题】:Complete Async web service communication - sender and receiver are not available same time完成异步 Web 服务通信 - 发送方和接收方不同时可用
【发布时间】:2018-06-29 10:22:17
【问题描述】:

两个系统通过集成(使用 apache-camel)相互通信。假设系统 A 需要向系统 B 提交请求,系统 B 已经公开了一个 Web 服务来接收数据,并且集成正在按照系统 B 的 Web 服务转换数据。

在上述场景中,A 和 B 必须同时可用,并且 A 必须等待 B 的响应。我需要通过将队列放在集成层并使用异步通信来消除这种依赖关系。 例如:

        <camel:route id="AtoIntegration">
        <camel:from
            uri="spring-ws:someEndPoint" />
        <camel:bean ref="testAsyncPreprocessor" />
        <camel:inOnly uri="activemq:requestqueue" />
    </camel:route>
    <camel:route id="integrationToB">
    <camel:from uri="activemq:requestqueue" />
    <camel:transacted  />
    <camel:bean ref="afterQueueProcessor" />
    <camel:setHeader headerName="CamelHttpMethod">
        <camel:constant>POST</camel:constant>
    </camel:setHeader>
    <camel:setHeader headerName="Content-Type">
        <camel:constant>application/x-www-form-urlencoded</camel:constant>
    </camel:setHeader>
    <camel:to uri="http://localhost:8080/systemB/newOrder?test=testData"
    />
</camel:route>

如上所述,即使系统 B 不可用,路由系统 A 也可以提交请求,但 route integrationToB 仍然需要系统 B 可用,否则它将失败并在重试后将请求放入死信队列。 所以我想弄清楚如何配置路由集成ToB,只有在系统 B 可用时才运行。

【问题讨论】:

    标签: apache-camel jms activemq spring-jms


    【解决方案1】:

    我不太明白,你说你在系统之间放置了一个排队机制。好的,但是如果您这样做了,则无需知道系统是否可用。该系统将在队列可用时从队列中消费。

    如果您仍然需要从队列发送到 Web 服务,那么在两者之间设置队列机制有什么意义?

    【讨论】:

    • 实际上我无法在系统 B 上安装 JMS 客户端,因此集成需要将请求推送到系统 B。因此,如果系统 B 不可用,我需要停止路由,而不是向 DLQ 发送请求。
    • 那么怎么知道系统B不可用呢?
    • Exchange 会得到 java.net.ConnectException
    • 好的,这样你就可以捕获该异常并发送触发器来控制总线组件并停止路由。
    • 我尝试使用 throttlingexceptionroutepolicy 但当前消息正在进入 DLQ,请参阅以下内容-stackoverflow.com/questions/48367905/…
    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多