私は Spring-Integration について学んでおり、Gateway と Service-Activators について基本的な理解があります。ゲートウェイのコンセプトが大好きです。Spring Integration は、実行時にゲートウェイのプロキシを生成します。このプロキシは、すべてのメッセージングの詳細をゲートウェイのコンシューマから隠します。さらに、生成されたプロキシは、要求と応答を相互に関連付けている場合もあります。
学習の目的で、ゲートウェイを使用せずに生の Spring Integration 機能を使用して、リクエストと応答の相関関係を実装することに着手しました。リクエスト ヘッダーに相関識別子を設定することはできますが、チャネルの応答を受信中に相関識別子を指定することはできません。以下(質問の最後)は、同じコードスニペットです。また、相関関係はメッセージ ブローカー (RabbitMQ など) に対してどのように機能しますか? RabbitMQ は、特定のヘッダー (相関識別子) を含むメッセージを取得する機能を提供しますか?
public class RemoteProxyCalculatorService implements CalculatorService
{
public int Square(int n)
{
UUID uuid = SendRequest(n, "squareRequestChannel");
int squareOfn = ReceiveReply("squareReplyChannel", uuid);
return squareOfn;
}
private <T> UUID SendRequest(T payload, String requestChannel)
{
UUID requestID = UUID.randomUUID();
Message<T> inputMessage = MessageBuilder.withPayload(payload)
.setCorrelationId(requestID)
.build();
MessageChannel channel = (MessageChannel)context.getBean(requestChannel, MessageChannel.class);
channel.send(inputMessage);
return requestID;
}
@SuppressWarnings("unchecked")
private <T> T ReceiveReply(String replyChannel, UUID requestID)
{
//How to consume requestID so as to receive only the reply related to the request posted by this thread
PollableChannel channel = (PollableChannel)context.getBean(replyChannel);
Message<?> groupMessage = channel.receive();
return (T)groupMessage.getPayload();
}
private ClassPathXmlApplicationContext context;
}
ありがとう。