天天看點

原生 Java 用戶端進行消息通信

原生 Java 用戶端進行消息通信

  DirectProducer:direct類型交換器的生産者

  NormalConsumer:普通的消費者

  MulitBindConsumer:隊列綁定到交換器上時,是允許綁定多個路由鍵的,也就是多重綁定MulitChannelConsumer:一個連接配接下允許有多個信道

  MulitConsumerOneQueue:一個隊列多個消費者,則會表現出消息在消費者之間的輪詢發送。

  使用 DirectProducer作為生産者,NormalConsumer作為消費者,消費者綁定一個隊列

原生 Java 用戶端進行消息通信

  MultiBindConsumer:隊列綁定到交換器上時,是允許綁定多個路由鍵的,也就是多重綁定對比:單個綁定的消費者隻能收到指定的消息,多重綁定的的消費者可以收到所有的消息。

原生 Java 用戶端進行消息通信

  MultiChannelConsumer:一個連接配接下允許有多個信道

  一個連接配接,我們可以使用多線程的方式模拟多個信道進行通訊。這樣可以做到多路複用。

  MultiConsumerOneQueue:一個隊列多個消費者,則會表現出消息在消費者之間的輪詢發送。

原生 Java 用戶端進行消息通信

  消息廣播到綁定的隊列

   不管我們如何調整生産者和消費者的路由鍵,都對消息的接受沒有影響。

  通過使用“*”和“#”,使來自不同源頭的消息到達同一個隊列,”.”将路由鍵分為了幾個辨別符,“*”比對 1個,“#”比對一個或多個。例子如

    假設有交換器 topic_course,

    講課老師有 king,mark,james,

    技術專題有 kafka,jvm,redis,

    課程章節有 A、B、C,

   路由鍵的規則為 講課老師+“.”+技術專題+“.”+課程章節,如:king.kafka.A。

*與#的差別:

  如果我們發送的路由鍵變成 king.kafka.A

  那麼隊列中如果綁定了 king.* 不能比對

  隊列中如果綁定了 king.# 能夠比對

1、要關注所有的課程,怎麼做?

  聲明一個隊列并綁定到交換器上:channel.queueBind(queueName,TopicProducer.EXCHANGE_NAME, "#");

2、關注 king 老師的所有課程,怎麼辦?

  聲明一個隊列并綁定到交換器上:channel.queueBind(queueName,TopicProducer.EXCHANGE_NAME, "king.#");

注意:如果這裡改為 king.* 的話,則不會出現任何資訊,因為 “*”比對 1個(使用.分割的辨別的個數)

3、關注 king 老師所有的 A 章節,怎麼辦?

  聲明一個隊列并綁定到交換器上:channel.queueBind(queueName,TopicProducer.EXCHANGE_NAME, "king.#.A");

  或者聲明一個隊列并綁定到交換器上:channel.queueBind(queueName,TopicProducer.EXCHANGE_NAME, "king.*.A");

4、關注 kafka 所有的課程,怎麼辦?

  聲明一個隊列并綁定到交換器上:channel.queueBind(queueName,TopicProducer.EXCHANGE_NAME, "#.kafka.#");

5、關注所有的 B 章節,怎麼辦?

  聲明一個隊列并綁定到交換器上:channel.queueBind(queueName,TopicProducer.EXCHANGE_NAME, "#.B");

6、關注 king 老師 kafka 的 A 章節,怎麼辦?

  聲明一個隊列并綁定到交換器上:channel.queueBind(queueName,TopicProducer.EXCHANGE_NAME, "king.kafka.A");

繼續閱讀