【问题标题】:Spring integration - read JDBC, send AMQP message and COMMITSpring集成——读取JDBC,发送AMQP消息和COMMIT
【发布时间】:2016-12-08 11:46:07
【问题描述】:

我正在尝试:

  1. 读取数据库
  2. 发送 AMQP 消息
  3. 更新数据库

如果发送消息失败,更新数据库也应该失败。如果更新数据库失败,消息将被发送多次。

<int:channel id="output-channel" />
<int-jdbc:inbound-channel-adapter query="SELECT MAX(d) AS d FROM a" update="UPDATE a SET d=1 WHERE d=367"
                                  channel="output-channel" data-source="dataSource">
    <int:poller fixed-rate="50000" max-messages-per-poll="1">
        <int:transactional transaction-manager="dataSourceTransactionManager2" />
    </int:poller>
</int-jdbc:inbound-channel-adapter>
<int-amqp:outbound-channel-adapter channel="output-channel" exchange-name="nameex" amqp-template="rabbitTemplate" />

我可以通过此设置看到,在更新失败时,根本不会发送消息。似乎在更新后调用 outbound-channel-adapter。

还有一个问题 - 每次我知道数据库中有什么东西时,是否有可能以编程方式触发入站通道适配器,但不要等待轮询器太久?

谢谢!

【问题讨论】:

  • 请粘贴一些有关jdbc入站适配器故障的异常信息。
  • 我创建的这个更新查询仅用于测试目的并且抛出的异常是重复的主键。我希望这会被抛出,但我也希望将消息发送到 amqp,但事实并非如此。

标签: java spring jdbc spring-integration spring-amqp


【解决方案1】:

要在 amqp 发送后更新,请将 outputChannel 设为 &lt;publish-subscribe-channel/&gt;

订阅 amqp 出站适配器和 JDBC 出站适配器(或网关)。为 amqp 设置order="1",为 JDBC 设置order="2"

【讨论】:

  • 我假设在这种情况下我根本不需要事务 - 因为我希望 JDBC 出站适配器不会在 AMQP 适配器未发送消息的情况下执行更新?
  • 正确 - 除非您将 ignore-failures 设置为 true,否则发送给一个订阅者的失败会引发异常并且其余订阅者不会收到消息。
【解决方案2】:

1) 使用 jdbc 出站网关代替适配器。

<int-jdbc:outbound-gateway>

2) 松散的轮询器并制作没有队列的通道。

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2016-01-09
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多