この永遠のもの、及びこれらのささいなことの春の雲の流れのカフカを話を続けます

前の記事では、春の雲の流れとカフカ統合する方法について話しました、そして、すべての権利であることをここで実際には、この記事の時点であれば宣伝春の雲の流れ、デモを駆け上がりました。しかし、実際には、プロジェクトはまだ簡単な技術的な問題は、実際の開発では、我々は詳細の多くに遭遇することはありませんありません(ピットと呼ばれる)、この記事では、に関するいくつかの小さな話を指しています、あなたの例を伝えるために使用され、プロジェクトの複雑さは、多くの場合、実際の退屈なステップに反映しました。

 

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对象,没有问题。

源代码

おすすめ

転載: www.cnblogs.com/wphmoon/p/11836523.html
おすすめ