次のルートのアプリケーションがあります。
from("netty:tcp://localhost:5150?sync=false&keepAlive=true")
.routeId("tcp.input")
.transform()
.simple("insert into tamponems (AVIS) values (\"${in.body}\");")
.to("jdbc:mydb");
このルートは、59 ミリ秒ごとに新しいメッセージを受信します。データベースへの接続が失われたときに、2 番目のメッセージが到着する前にルートを停止したい。そして主に、私は決してメッセージを失いたくない.
私はそのように進めました:
追加しましたerrorHandler
:
errorHandler(deadLetterChannel("direct:backup")
.redeliveryDelay(5L)
.maximumRedeliveries(1)
.retryAttemptedLogLevel(LoggingLevel.WARN)
.logExhausted(false));
メッセージのerrorHandler
再配信を試みますが、再度失敗した場合は、メッセージをdeadLetterChannel
.
次の deadLetterChannel は、tcp.input
ルートを停止し、メッセージをデータベースに再配信しようとします。
RoutePolicy policy = new StopRoutePolicy();
from("direct:backup")
.routePolicy(policy)
.errorHandler(
defaultErrorHandler()
.redeliveryDelay(1000L)
.maximumRedeliveries(-1)
.retryAttemptedLogLevel(LoggingLevel.ERROR)
)
.to("jdbc:mydb");
のコードは次のroutePolicy
とおりです。
public class StopRoutePolicy extends RoutePolicySupport {
private static final Logger LOG = LoggerFactory.getLogger(String.class);
@Override
public void onExchangeDone(Route route, Exchange exchange) {
String stop = "tcp.input";
CamelContext context = exchange.getContext();
if (context.getRouteStatus(stop) != null && context.getRouteStatus(stop).isStarted()) {
try {
exchange.getContext().getInflightRepository().remove(exchange);
LOG.info("STOP ROUTE: {}", stop);
context.stopRoute(stop);
} catch (Exception e) {
getExceptionHandler().handleException(e);
}
}
}
}
この方法に関する私の問題は次のとおりです。
- 私のルートでは、を -1
"direct:backup"
に設定すると、ルートは決して停止しませんmaximumRedeliveries
tcp.input
- 停止中にメッセージが失われます
- 接続損失を検出し、ルートを停止するためのこの方法は長すぎます
メッセージを失わないようにするために、これをより速くする、またはこれを別の方法で作成するためのアイデアを誰かが持っていますか?