0

サンプルの 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 つにルーティングされるようにするにはどうすればよいですか?

4

1 に答える 1

0

以前は気付きませんでした - あなたがconsumer.宿泊施設から行方不明になっています:

spring.cloud.stream.bindings.input.consumer.partitioned=true

ドキュメントを参照してください。

プロパティ ファイルの作成に IDE を使用していますか? 私のバージョンの STS (3.8.1) は、プロパティをコピーしたときにこれを問題としてフラグ付けしました。

テストを実行したところ、キューに正しい名前が付けられ、正しいキーで交換にバインドされました。

編集

PCF で適切にスケーリングするには、プロパティをコメントアウトする必要がありましたinstanceIndex(おそらく PCF 環境プロパティをオーバーライドするため)。そうしないと、-0キューに 2 つのコンシューマがありました。そのプロパティを削除すると、予想どおり 2 つのキューが得られました。

于 2016-08-17T13:15:23.423 に答える