二.Consumer、Producer简单例子

1、先导入jar包,我使用的是maven

<dependency>
            <groupId>com.alibaba.rocketmq</groupId>
            <artifactId>rocketmq-all</artifactId>
            <version>3.4.9</version>
            <type>pom</type>
        </dependency>
        <!-- rocker-mq核心:start -->
        <dependency>
            <groupId>com.aliyun.openservices</groupId>
            <artifactId>ons-client</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>3.2.6</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.1</version>
        </dependency>
2、消息订阅
import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.common.message.MessageExt;

/**
 * 消息订阅
 * 
 * @author admin
 *
 */
public class Consumer {
    public static void main(String[] args) throws InterruptedException, MQClientException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("QuickStartConsumer");
        /**
         * 1、负责查找NameServer,多个NameServer地址用分号隔开
         */
        consumer.setNamesrvAddr("127.0.0.1:9876");
        consumer.setInstanceName("QuickStartConsumer");
        
         /** 
         * 订阅指定topic下tags分别等于TagA或TagC或TagD 
         */  
        consumer.subscribe("TopicModel","TagA");  
        /** 
         * 订阅指定topic下所有消息<br> 
         * 注意:一个consumer对象可以订阅多个topic 
         */  
        consumer.subscribe("TopicMode2","*");  

        consumer.registerMessageListener(new MessageListenerConcurrently() {

            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                System.out.println(Thread.currentThread().getName() + " 接收消息: " + msgs.size());
                MessageExt msg = msgs.get(0);
                if (msg.getTopic().equals("TopicModel")) {
                    // 执行TopicModel的消费逻辑
                    if (msg.getTags() != null && msg.getTags().equals("TagA")) {
                        // 执行TagA的消费
                        System.out.println("执行消费逻辑:"+new String(msg.getBody()));
                    }
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        /** 
         * Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br> 
         */  
        consumer.start();
        System.out.println("\nConsumer Started.========>运行...\n");
    }
}
3、消息产生者Producer
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
import com.alibaba.rocketmq.client.producer.SendResult;
import com.alibaba.rocketmq.common.message.Message;

/**
 * 消息产生者Producer
 * 
 * @author admin
 *
 */
public class Producer {
    public static void main(String[] args) throws MQClientException, InterruptedException {
        /**
         * 一个应用创建一个Producer,由应用来维护此对象,可以设置为全局对象或者单例<br>
         * 注意:ProducerGroupName需要由应用来保证唯一<br>
         * ProducerGroup这个概念发送普通的消息时,作用不大,但是发送分布式事务消息时,比较关键,
         * 因为服务器会回查这个Group下的任意一个Producer
         */
        DefaultMQProducer producer = new DefaultMQProducer("QuickStartProducer");
        /**
         * 1、负责查找NameServer,多个NameServer地址用分号隔开
         */
        producer.setNamesrvAddr("127.0.0.1:9876");
        /**
         * 2、客户端实例名称(这个实例包含网络连接、线程资源等)
         */
        producer.setInstanceName("QuickStartProducer");
        /**
         * 3、Producer对象在使用之前必须要调用start初始化,初始化一次即可<br>
         * 注意:切记不可以在每次发送消息时,都调用start方法
         */
        producer.start();
        /**
         * 这里模拟了 10 次消息发送,一个Producer对象可以发送多个topic,多个tag的消息。
         * //发生消息时必须声明区分Message msg = new Message("MQ_TOPIC","TagA","Hello MQ".getBytes());:
         */
        for (int I = 1; I <=1; I++) {
            try {
                {
                    Message msg = new Message("TopicModel", // topic:必填,线下环境不需要申请,线上环境需要申请后才能使用
                            "TagA", // tag:设置的标签,方便服务器过滤使用。目前只支持每个消息设置一个tag
                            "OrderID001",// key  :保证key唯一,订单号,商品Id等,代表这条消息的业务关键词,可以在Console系统根据Topic、Keys来查询消息
                            ("产品:内容......" + I).getBytes()// body:序列化应用,Producer与Consumer要协商好序列化形式。
                    );
                    SendResult sendResult = producer.send(msg);
                    System.out.println(sendResult);
                }
                {
                    Message msg = new Message("TopicModel",
                            "TagB", 
                            "OrderID002",
                            ("特定信息:......" + I).getBytes()
                    );
                    SendResult sendResult = producer.send(msg);
                    System.out.println(sendResult);
                }
                {
                    Message msg = new Message("TopicMode2",
                            "TagA", 
                            "OrderID002",
                            ("订单:......" + I).getBytes()
                    );
                    SendResult sendResult = producer.send(msg);
                    System.out.println(sendResult);
                }
            } catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
            }
        }
        /**
         * 应用退出时,要调用shutdown来清理资源,关闭网络连接,从MetaQ服务器上注销自己
         * 注意:我们建议应用在JBOSS、Tomcat等容器的退出钩子里调用shutdown方法
         */
        // producer.shutdown();
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

            @Override
            public void run() {
                producer.shutdown();
                System.out.println("\nProducer========>运行...\n");
            }
        }));
        System.exit(0);
    }
}
⦁    消息产生者Producer
       /**
        * 一个应用创建一个Producer,由应用来维护此对象,可以设置为全局对象或者单例
         * 注意:ProducerGroupName需要由应用来保证唯一
         * ProducerGroup这个概念发送普通的消息时,作用不大,但是发送分布式事务消息时,比较关键,
         * 因为服务器会回查这个Group下的任意一个Producer
         */
        DefaultMQProducer producer = new DefaultMQProducer("QuickStartProducer");
        /**
         * 1、负责查找NameServer,多个NameServer地址用分号隔开
         */
        producer. setNamesrvAddr ("127.0.0.1:9876");
        /**
         * 2、客户端实例名称(这个实例包含网络连接、线程资源等)
         */
        producer. setInstanceName("QuickStartProducer");
        /**
         * 3、Producer对象在使用之前必须要调用start初始化,初始化一次即可
         * 注意:切记不可以在每次发送消息时,都调用start方法
         */
        producer. start ();
posted @ 2017-04-16 03:03  逍遥叹!!  阅读(2149)  评论(0编辑  收藏  举报