Alpakka AMQP:如何检测声明异常?
我有一个带有声明的AMQP源和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
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(..)时,它工作正常
所以我的问题是:
对于答案1和3,
AmqpSink
具体化了您必须保留的CompletionStage
,并处理(注册一些回调函数)以观察流的失败和完成。在docs示例中,我们在生产代码中不好的完成阶段(),这可能是因为该示例包含在一个Alpakka测试中。请选择通常的CompletionStage
callback/transformation方法(参见示例)
CompletionStage
在错误发生时、流具体化/启动时或在元素处理期间将失败,或者在源到达末尾并且每个元素通过流进入接收器时完成。这意味着,对于启动流,如果它没有很快失败,那么它将失败跑步
对于问题2,不确定是否可以忽略声明异常,这可能是因为这些异常总是导致连接失败。当我使用AmqpFlow进行写入,然后再进行一些映射时..我执行了一个Sink。最后忽略。在这种情况下,我如何检测失败?流中的失败将进入下游,并最终在物化过程中结束
接收器的值。忽略
,因此请确保保持该值。谢谢。这意味着当蒸汽的完成阶段完成时,流就完成了,不再运行。谢谢!
amqpSource.map(doSomething).async().map(doSomethingElse).async().to(amqpSink)