次のPHPアプリケーションがあります。これにより、ユーザーのサインアップがメッセージ キューにパブリッシュされます。Java アプリケーションはそのキューから読み取り、インポートします。うまくいけば、下の図がそれを説明します。私は Java 側の作業のみを行っています。json メッセージは既にキューに存在します。
ルート (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時間ごとに無期限にメッセージを再試行しますか?..次に、ログを表示してエラーを確認し、修正をアップロードすると、メッセージが再処理されますか?
どうすればそれを実装できますか?それとも私は間違った道を進んでいますか?
EDIT 私はdeadLetterExchangeを設定して、物事が正しい方向に進むかどうかを確認しようとしました...しかし、エラーが発生し、キューを非nullにすることはできません
rabbitmq://phpSignUp.exchange?username=etc...&deadLetterExchange=signUpDeadLetter.exchange