Alpakka AMQP:如何检测声明异常?

Alpakka AMQP:如何检测声明异常?,akka,akka-stream,akka-http,akka-cluster,alpakka,Akka,Akka Stream,Akka Http,Akka Cluster,Alpakka,我有一个带有声明的AMQP源和AMQP接收器: List<Declaration> declarations = new ArrayList<Declaration>() {{ add(QueueDeclaration.create(sourceExchangeName)); add(BindingDeclaration.create(sourceExchangeName, sourceExchangeName).withRoutingKey(so

我有一个带有声明的AMQP源和AMQP接收器:

List<Declaration> declarations = new ArrayList<Declaration>() {{
      add(QueueDeclaration.create(sourceExchangeName));
      add(BindingDeclaration.create(sourceExchangeName, sourceExchangeName).withRoutingKey(sourceRoutingKey));
    }};

amqpSource = AmqpSource
    .committableSource(
        NamedQueueSourceSettings.create(connectionProvider, sourceExchangeName)
            .withDeclarations(declarations),
        bufferSize);

AmqpWriteSettings amqpWriteSettings = AmqpWriteSettings.create(connectionProvider)
    .withExchange("DEST_XCHANGE")
    .withRoutingKey("ROUTE123")
    .withDeclaration(ExchangeDeclaration.create(destinationExchangeName,
        BuiltinExchangeType.DIRECT.getType()));

amqpSink = AmqpSink.create(amqpWriteSettings);
现在,在我启动应用程序后,发送到源队列的消息没有被使用。我后来发现这是由于声明期间发生的错误造成的。(即,当我删除源和接收器设置中的.withDeclarations(..)时,它工作正常

所以我的问题是:

  • 如何检测AMQP源和接收器是否正常运行
  • 如何忽略声明异常
  • 如果发生任何异常,我如何知道并使系统失败

  • 对于答案1和3,
    AmqpSink
    具体化了您必须保留的
    CompletionStage
    ,并处理(注册一些回调函数)以观察流的失败和完成。在docs示例中,我们在生产代码中不好的完成阶段(),这可能是因为该示例包含在一个Alpakka测试中。请选择通常的
    CompletionStage
    callback/transformation方法(参见示例)

    CompletionStage
    在错误发生时、流具体化/启动时或在元素处理期间将失败,或者在源到达末尾并且每个元素通过流进入接收器时完成。这意味着,对于启动流,如果它没有很快失败,那么它将失败跑步


    对于问题2,不确定是否可以忽略声明异常,这可能是因为这些异常总是导致连接失败。

    当我使用AmqpFlow进行写入,然后再进行一些映射时..我执行了一个Sink。最后忽略。在这种情况下,我如何检测失败?流中的失败将进入下游,并最终在物化过程中结束
    接收器的值。忽略
    ,因此请确保保持该值。谢谢。这意味着当蒸汽的完成阶段完成时,流就完成了,不再运行。谢谢!
    amqpSource.map(doSomething).async().map(doSomethingElse).async().to(amqpSink)