次のPHPアプリケーションがあります。これにより、ユーザーのサインアップがメッセージキューにパブリッシュされます。 Javaアプリケーションはそのキューから読み込み、それをインポートします。うまくいけば、以下のダイアグラムがそれを討論するでしょう。私は物事のJava側でのみ作業しています。 jsonメッセージはすでにキューに存在します。RabbitMQ - Apache Camel読んでいるメッセージ失敗したメッセージの処理方法
ルート(Javaはサイドを消費)。
@Component
public class SignUpRouting {
errorHandler(deadLetterChannel("rabbitmq://signUpDeadLetter.exchange?username=etc..").useOriginalMessage());
from("rabbitmq://phpSignUp.exchange?username=etc....")
.routeId("signUpRoute")
.processRef("signUpProcessor")
.end();
//....
プロセッサ..
@Component
public class SignupProcessor implements Processor {
private ObjectMapper mapper = new ObjectMapper();
@Override
public void process(Exchange exchange) throws Exception {
String json = exchange.getIn().getBody(String.class);
SignUpDto dto = mapper.readValue(json, SignUpDto.class);
SignUp signUp = new SignUp();
signUp.setWhatever(dto.getWhatever());
//etc....
// save record
signUpDao.save(signUp);
}
}
私の質問は、この..です私は、プロセッサがメッセージをインポートするために失敗したときに私は何をすべき。
たとえば、DAO例外があったとします。データフィールドがツールインされているか、インポートが間違った形式であった可能性があります。私はメッセージを失いたくない。私はエラーを見て、インポートを再試行したいと思います。しかし、私は30秒ごとにメッセージを再試行し続けたくありません。
私は別のキューを作成する必要があると思っています。デッド・レター・キューで、6時間ごとにメッセージを無期限に再試行していますか?それから、ログにエラーが表示され、修正プログラムとメッセージ再処理されるだろうか?
どうすれば実装できますか?または私は間違ったトラックにいますか?
私は正しい方向に物事を得るでしょうかどうかを確認するためにdeadLetterExchangeを設定しようとしたEDIT ...しかし、エラーやキューはあなたがonExceptionを使用することができ
rabbitmq://phpSignUp.exchange?username=etc...&deadLetterExchange=signUpDeadLetter.exchange
別のキューを使用している場合は、例外のスタックトレースとともに正確に失敗したメッセージを格納し、そのキューのデータを処理しないでください。 –
わかりません。あなたは例を挙げることができますか? –
サポートチームの贅沢をお持ちの場合は、別のキューにメッセージを送信するか、データベーステーブルに書き込んだり、サポートスタッフに電子メールを送信したりしてください。サポートスタッフがメッセージのテキストを変更してサインアッププロセッサに再投入できるようにする別のインターフェイスを作成します。あなたがしていることは、手動による介入を必要とすることです。それに従って設計する。彼がまれなイベントであるように、PHPアプリケーションの良い検証が必要です。 – Sammy