前の記事では、春の雲の流れとカフカ統合する方法について話しました、そして、すべての権利であることをここで実際には、この記事の時点であれば宣伝春の雲の流れ、デモを駆け上がりました。しかし、実際には、プロジェクトはまだ簡単な技術的な問題は、実際の開発では、我々は詳細の多くに遭遇することはありませんありません(ピットと呼ばれる)、この記事では、に関するいくつかの小さな話を指しています、あなたの例を伝えるために使用され、プロジェクトの複雑さは、多くの場合、実際の退屈なステップに反映しました。
1、グループ構成
送信メッセージ内の構成では、グループが構成されていません
この証明についてソースコード内のコメントで見ることができます
org.springframework.cloud.stream.config.BindingProperties
2、パーティションのトピックを変更
次のようにコンフィギュレーションファイルがあります
bindings:
output:
binder: kafka
destination: wph-d-2 #消息发往的目的地,对应topic
content-type: text/plain #消息的格式
producer:
partitionCount: 7
partitionCountパーティションを設定するために使用される番号である、話題がすでに構築されている場合、デフォルトは、1です、修正partitionCount無効、エラーメッセージが表示されます
Caused by: org.springframework.cloud.stream.provisioning.ProvisioningException: The number of expected partitions was: 7, but 5 have been found instead.Consider either increasing the partition count of the topic or enabling `autoAddPartitions` at org.springframework.cloud.stream.binder.kafka.provisioning.KafkaTopicProvisioner.createTopicAndPartitions(KafkaTopicProvisioner.java:384) ~[spring-cloud-stream-binder-kafka-core-3.0.0.M4.jar:3.0.0.M4] at org.springframework.cloud.stream.binder.kafka.provisioning.KafkaTopicProvisioner.createTopicIfNecessary(KafkaTopicProvisioner.java:325) ~[spring-cloud-stream-binder-kafka-core-3.0.0.M4.jar:3.0.0.M4] at org.springframework.cloud.stream.binder.kafka.provisioning.KafkaTopicProvisioner.createTopic(KafkaTopicProvisioner.java:302) ~[spring-cloud-stream-binder-kafka-core-3.0.0.M4.jar:3.0.0.M4] ... 14 common frames omitted
エラープロンプトによっては、autoAddPartitionsを追加します
kafka:
binder:
brokers: #Kafka的消息中间件服务器地址
- localhost:9092
autoAddPartitions: true
あなたは、パーティションの数が変更されている見ることができ、再び起動します
属性クラスに対応するautoAddPartitionsはorg.springframework.cloud.stream.binder.kafka.properties.KafkaBinderConfigurationPropertiesです
クラス属性がpartitionCount org.springframework.cloud.stream.binder.ProducerProperties設定されています
図3に示すように、伝送エラーJSON
トランスミッション郵便配達のsendMessage / complexTypeに与えられました
コンテンツサーバ側のエラーです。
Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/plain;charset=UTF-8' not supported]
その理由は、データの伝送フォーマットの伝送エラーは、フォーマットにデータを送信するための郵便配達を変更することです
そして、問題は行くことが幸せになることができます
4、正しい送信およびオブジェクトJSONに変換
如果我们需要传输json的信息,那么在发送消息端需要设置content-type为json(其实可以不写,默认content-type就是json,后面会讲)
bindings:
output:
binder: kafka
destination: wph-d-2 #消息发往的目的地,对应topic
content-type: application/json #消息的格式
然后通过producer发送这个消息
@RequestMapping(value = "/sendMessage/complexType", method = RequestMethod.POST)
public String publishMessageComplextType(@RequestBody ChatMessage payload) { logger.info(payload.toString()); producer.getMysource().output().send(MessageBuilder.withPayload(payload).setHeader("type", "chatMessage").build()); return "success"; }
这里需要注意的一点是ChatMessage的field name必须要有getter和settr方法,两者有一就可以了,否则json转换成对象的时候,field name收不到值。
在订阅消息的时候,application.yml里面content-type可以不用配置,这个值默认就是“application/json”,这一点可以在org.springframework.cloud.stream.config.BindingProperties类的注释里面看到
和上面一样,ChatMessage的field name需要有getter或者setter的方法,二者之一就行。
接收json并转换成类的方法如下:
@StreamListener(target = Sink.INPUT, condition = "headers['type']=='chatMessage'")
public void handle(ChatMessage message) { logger.info(message.toString()); }
有坑警告:如果我们把发送消息端的content-type设置成text/plain,消息订阅端的content-type设置成application/json,就会在消息订阅端报这个错误
Caused by: java.lang.IllegalStateException: argument type mismatch Endpoint [com.wphmoon.kscsclient.Consumer]
如果颠倒过来的话,发送消息端的content-type设置成application/json,消息订阅端设置成text/plain,我实际测试过,是可以收到消息,并且能转换成ChatMessage对象,没有问题。