Skip to content

Java messageproducer

dennis zhuang edited this page May 28, 2013 · 13 revisions

#消息生产者

MQ系统的三个角色:生产者,消费者和队列。生产者作为消息内容的提供商,是整个系统的驱动者。生产者发送消息到队列服务器,消费者从队列服务器获取消息并消费。三者分工明确,密切协作来完成异步任务。

#创建生产者

上一节创建了消息会话工厂后,就可以通过工厂来创建消息生产者,这都是通过createProducer方法:

    final MessageProducer producer = sessionFactory.createProducer();

创建的生产者是MessageProducer类的实例,有了生产者是不是就可以马上发送消息?很抱歉,不行。原因是这样,服务端注册它提供的topic到zookeeper,但是客户端链接到zookeeper后还不知道应该连接哪个服务器。它必须告诉zookeeper想去连接哪个topic的服务器,拿到服务器地址,然后才能建立socket连接,最后才可以发送消息。

因此创建生产者之后还需要一个发布Topic的过程:

        // publish topic
        final String topic = "meta-test";
        producer.publish(topic);

假设我们要发送的消息的主题是meta-test,那么只要调用publish(topic)这个方法就可以告诉zookeeper我们想要查找提供topic为meta-test的服务器,从zookeeper获取服务器地址后,会话工厂会连接服务器,生产者就可以使用这些连接来发送消息了。

publish(topic)方法可以针对同一个topic调用多次,这跟调用一次的效果是一样的。

同一个生产者想要发送多个不同topic的消息,那么这些topic都需要被发布一次:

    producer.publish("topic1");
    producer.publish("topic2");

例如,这里我们发布了两个topic:topic1topic2,接下来就可以尝试发送这些主题的消息。

##发布的topic没有服务器提供

我们发布了meta-test的主题,然后希望zookeeper告诉我们哪里有提供meta-test主题的队列服务的服务器,但是zookeeper可能找不到提供这个主题服务的服务器,那么在发送消息的时候就会看到这样的异常: There is no aviable partition for topic meta-test,maybe you don't publish it at first?,这种情况你必须检查你的服务器是否配置了meta-test这个topic,并且客户端和服务器的zookeeper配置也保持一致。

Clone this wiki locally