サンプルの HttpSource と HttpSink を作成しました。私のapplication.propertiesは次のようになります
Source
spring.cloud.stream.bindings.output.destination=greetings
spring.cloud.stream.bindings.output.partitionKeyExpression=payload
spring.cloud.stream.bindings.output.partitionCount=2
Sink
spring.cloud.stream.bindings.input.destination=greetings
spring.cloud.stream.bindings.input.partitioned=true
spring.cloud.stream.instanceCount=2
spring.cloud.stream.instanceIndex=0
HttpSource
@RestController
@EnableBinding(Source.class)
public class SampleSource {
@Autowired
private MessageChannel output;
@RequestMapping(path="/message",method=RequestMethod.POST)
public void sendMessage(@RequestBody String name){
output.send(MessageBuilder.withPayload("Hello, "+name).build());
}
}
HttpSink
@EnableBinding(Sink.class)
public class SampleSink {
@ServiceActivator(inputChannel=Sink.INPUT)
public void sendMessage(String name){
System.out.println(name);
}
}
これらのアプリは両方とも Pivotal Cloud Foundry にデプロイしました。HttpSource には、呼び出し時に「挨拶」と呼ばれるトピック交換にメッセージを送信するエンドポイントがあります。次に、2 つのインスタンスを持つように HttpSink をスケーリングしました。これにより、「あいさつ」交換への 2 つのキューとバインディングが作成されました。
エンドポイントに到達すると、メッセージが両方のキューに送信されていることがわかります。ログを追跡したところ、メッセージが 2 回出力されていることがわかったので、これを知っています。
メッセージを 1 つのキューだけに送るにはどうすればよいですか?
編集:
Pivotal Cloud Foundry 内で HttpSink をスケーリングする代わりに、HttpSink を 2 つの異なるアプリとしてデプロイしました。しかし、application.properties では、それらは同じグループに属していました。そのうちの 1 つは instanceIndex=0 で、もう 1 つは instanceIndex=1 でした。
今でも、「#」としてバインドされた単一のキューと、そのキューへの 2 つのコンシューマーを取得しています。
HttpSink のさまざまなインスタンスが独自のキューを作成し、HttpSource からのメッセージが partitionKey に基づいてそれらの 1 つにルーティングされるようにするにはどうすればよいですか?