日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

示例代碼

云消息隊列 RocketMQ 版5.x版本實例可兼容4.x/3.x SDK客戶端接入,您可以使用4.x/3.x版本的SDK接入5.x實例進行消息收發(fā)。本文為您介紹4.x/3.x版本下的Java SDK消息收發(fā)示例代碼。

重要
  • 推薦您使用最新的RocketMQ 5.x系列SDK,5.x系列SDK作為主力研發(fā)版本,和云消息隊列 RocketMQ 版5.x服務端完全兼容,提供了更全面的功能并支持更多增強特性。更多信息,請參見5.x系列SDK
  • RocketMQ 4.x/3.x系列SDK和ONS系列SDK后續(xù)僅做功能維護,建議僅存量業(yè)務使用。

普通消息收發(fā)示例

發(fā)送普通消息(同步發(fā)送)

import java.util.Date;

import org.apache.rocketmq.acl.common.AclClientRPCHook;
import org.apache.rocketmq.acl.common.SessionCredentials;
import org.apache.rocketmq.client.AccessChannel;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.RPCHook;
import org.apache.rocketmq.remoting.common.RemotingHelper;

public class RocketMQProducer {
    /**
     * 如果是使用公網接入點訪問,則必須設置RpcHook,里面填寫實例的用戶名和密碼。實例用戶名和密碼在控制臺訪問控制的智能身份識別頁簽中獲取。
     * 注意!!!這里填寫的不是阿里云賬號的AccessKey ID和AccessKey Secret,請務必區(qū)分開。
     * 如果是在阿里云ECS內網訪問,無需初始化RpcHook,服務端會根據(jù)內網VPC信息智能獲取。
     * 如果實例類型為Serverless實例,公網訪問必須設置實例的用戶名密碼,當開啟內網免身份識別時,內網訪問可以不設置用戶名和密碼。
     */
    private static RPCHook getAclRPCHook() {
        return new AclClientRPCHook(new SessionCredentials("INSTANCE USER NAME", "INSTANCE PASSWORD"));
    }

    public static void main(String[] args) throws MQClientException {
        // 使用公網接入點時,需要配置RPCHook。
        DefaultMQProducer producer = new DefaultMQProducer(getAclRPCHook());
        // 使用VPC接入點時,無需配置RPCHook。
        // 如果實例類型為Serverless實例,則必須配置RPCHook。
        // DefaultMQProducer producer = new DefaultMQProducer();

        //您在消息隊列RocketMQ版控制臺創(chuàng)建的Group ID。
        producer.setProducerGroup("YOUR GROUP ID");

        // 設置接入方式為阿里云,在使用云上消息軌跡的時候,需要設置此項;如果不開啟消息軌跡功能,則不需要運行此項。
        producer.setAccessChannel(AccessChannel.CLOUD);

        // 設置為您從阿里云消息隊列RocketMQ版控制臺獲取的接入點信息,類似“rmq-cn-XXXX.rmq.aliyuncs.com:8080”。
        // 注意!!!直接填寫控制臺提供的域名和端口即可,請勿添加http://或https://前綴標識,也不要用IP解析地址。
        producer.setNamesrvAddr("YOUR ACCESS POINT");
        producer.start();

        for (int i = 0; i < 128; i++) {
            try {
                Message msg = new Message("YOUR TOPIC",
                        "YOUR MESSAGE TAG",
                        "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
                SendResult sendResult = producer.send(msg);
                System.out.printf("%s%n", sendResult);
            } catch (Exception e) {
                //消息發(fā)送失敗,需要進行重試處理,可重新發(fā)送這條消息或持久化這條數(shù)據(jù)進行補償處理。
                System.out.println(new Date() + " Send mq message failed.");
                e.printStackTrace();
            }
        }

        // 在應用退出前,銷毀Producer對象。
        // 注意:銷毀Producer對象可以節(jié)約系統(tǒng)內存,若您需要頻繁發(fā)送消息,則無需銷毀Producer對象。
        producer.shutdown();
    }
}

發(fā)送普通消息(異步發(fā)送)

import java.util.Date;
import java.util.concurrent.TimeUnit;

import org.apache.rocketmq.acl.common.AclClientRPCHook;
import org.apache.rocketmq.acl.common.SessionCredentials;
import org.apache.rocketmq.client.AccessChannel;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.RPCHook;
import org.apache.rocketmq.remoting.common.RemotingHelper;

public class RocketMQAsyncProducer {
    /**
     * 如果是使用公網接入點訪問,則必須設置RpcHook,里面填寫實例的用戶名和密碼。實例用戶名和密碼在控制臺訪問控制的智能身份識別頁簽中獲取。
     * 注意!!!這里填寫的不是阿里云賬號的AccessKey ID和AccessKey Secret,請務必區(qū)分開。
     * 如果是在阿里云ECS內網訪問,無需初始化RpcHook,服務端會根據(jù)內網VPC信息智能獲取。
     * 如果實例類型為Serverless實例,公網訪問必須設置實例的用戶名密碼,當開啟內網免身份識別時,內網訪問可以不設置用戶名和密碼。
     */
    private static RPCHook getAclRPCHook() {
        return new AclClientRPCHook(new SessionCredentials("INSTANCE USER NAME", "INSTANCE PASSWORD"));
    }

    public static void main(String[] args) throws MQClientException, InterruptedException {
        // 使用公網接入點時,需要配置RPCHook。
        DefaultMQProducer producer = new DefaultMQProducer(getAclRPCHook());
        // 使用VPC接入點時,無需配置RPCHook。
        // 如果實例類型為Serverless實例,則必須配置RPCHook。
        // DefaultMQProducer producer = new DefaultMQProducer();

        //您在消息隊列RocketMQ版控制臺創(chuàng)建的Group ID
        producer.setProducerGroup("YOUR GROUP ID");

        // 設置接入方式為阿里云,在使用云上消息軌跡的時候,需要設置此項;如果不開啟消息軌跡功能,則不需要運行此項。
        producer.setAccessChannel(AccessChannel.CLOUD);

        // 設置為您從阿里云消息隊列RocketMQ版控制臺獲取的接入點信息,類似“rmq-cn-XXXX.rmq.aliyuncs.com:8080”。
        // 注意!!!直接填寫控制臺提供的域名和端口即可,請勿添加http://或https://前綴標識,也不要用IP解析地址。
        producer.setNamesrvAddr("YOUR ACCESS POINT");
        producer.start();

        for (int i = 0; i < 128; i++) {
            try {
                Message msg = new Message("YOUR TOPIC",
                        "YOUR MESSAGE TAG",
                        "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
                producer.send(msg, new SendCallback() {
                    @Override
                    public void onSuccess(SendResult result) {
                        // 消息發(fā)送成功。
                        System.out.println("send message success. msgId= " + result.getMsgId());
                    }

                    @Override
                    public void onException(Throwable throwable) {
                        // 消息發(fā)送失敗,需要進行重試處理,可重新發(fā)送這條消息或持久化這條數(shù)據(jù)進行補償處理。
                        System.out.println("send message failed.");
                        throwable.printStackTrace();
                    }
                });
            } catch (Exception e) {
                // 消息發(fā)送失敗,需要進行重試處理,可重新發(fā)送這條消息或持久化這條數(shù)據(jù)進行補償處理。
                System.out.println(new Date() + " Send mq message failed.");
                e.printStackTrace();
            }
        }
        // 阻塞當前線程3秒,等待異步發(fā)送結果。
        TimeUnit.SECONDS.sleep(3);

        // 在應用退出前,銷毀Producer對象。
        // 注意:銷毀Producer對象可以節(jié)約系統(tǒng)內存,若您需要頻繁發(fā)送消息,則無需銷毀Producer對象。
        producer.shutdown();
    }
}

發(fā)送普通消息(單向發(fā)送)

import java.util.Date;

import org.apache.rocketmq.acl.common.AclClientRPCHook;
import org.apache.rocketmq.acl.common.SessionCredentials;
import org.apache.rocketmq.client.AccessChannel;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.RPCHook;
import org.apache.rocketmq.remoting.common.RemotingHelper;

public class RocketMQOnewayProducer {
    /**
     * 如果是使用公網接入點訪問,則必須設置RpcHook,里面填寫實例的用戶名和密碼。實例用戶名和密碼在控制臺訪問控制的智能身份識別頁簽中獲取。
     * 注意!!!這里填寫的不是阿里云賬號的AccessKey ID和AccessKey Secret,請務必區(qū)分開。
     * 如果是在阿里云ECS內網訪問,無需初始化RpcHook,服務端會根據(jù)內網VPC信息智能獲取。
     * 如果實例類型為Serverless實例,公網訪問必須設置實例的用戶名密碼,當開啟內網免身份識別時,內網訪問可以不設置用戶名和密碼。
     */
    private static RPCHook getAclRPCHook() {
        return new AclClientRPCHook(new SessionCredentials("INSTANCE USER NAME", "INSTANCE PASSWORD"));
    }

    public static void main(String[] args) throws MQClientException {
        // 使用公網接入點時,需要配置RPCHook。
        DefaultMQProducer producer = new DefaultMQProducer(getAclRPCHook());
        // 使用VPC接入點時,無需配置RPCHook。
        // 如果實例類型為Serverless實例,則必須配置RPCHook。
        // DefaultMQProducer producer = new DefaultMQProducer();

        //您在消息隊列RocketMQ版控制臺創(chuàng)建的Group ID。
        producer.setProducerGroup("YOUR GROUP ID");

        // 設置接入方式為阿里云,在使用云上消息軌跡的時候,需要設置此項;如果不開啟消息軌跡功能,則不需要運行此項。
        producer.setAccessChannel(AccessChannel.CLOUD);

        // 設置為您從阿里云消息隊列RocketMQ版控制臺獲取的接入點信息,類似“rmq-cn-XXXX.rmq.aliyuncs.com:8080”。
        // 注意!!!直接填寫控制臺提供的域名和端口即可,請勿添加http://或https://前綴標識,也不要用IP解析地址。
        producer.setNamesrvAddr("YOUR ACCESS POINT");
        producer.start();

        for (int i = 0; i < 128; i++) {
            try {
                Message msg = new Message("YOUR TOPIC",
                        "YOUR MESSAGE TAG",
                        "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
                producer.sendOneway(msg);
            } catch (Exception e) {
                // 消息發(fā)送失敗,需要進行重試處理,可重新發(fā)送這條消息或持久化這條數(shù)據(jù)進行補償處理。
                System.out.println(new Date() + " Send mq message failed.");
                e.printStackTrace();
            }
        }

        // 在應用退出前,銷毀Producer對象。
        // 注意:銷毀Producer對象可以節(jié)約系統(tǒng)內存,若您需要頻繁發(fā)送消息,則無需銷毀Producer對象。
        producer.shutdown();
    }
}

訂閱普通消息

import org.apache.rocketmq.acl.common.AclClientRPCHook;
import org.apache.rocketmq.acl.common.SessionCredentials;
import org.apache.rocketmq.client.AccessChannel;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.RPCHook;

import java.util.List;

public class RocketMQPushConsumer {
    /**
     * 如果是使用公網接入點訪問,則必須設置RpcHook,里面填寫實例的用戶名和密碼。實例用戶名和密碼在控制臺訪問控制的智能身份識別頁簽中獲取。
     * 注意!!!這里填寫的不是阿里云賬號的AccessKey ID和AccessKey Secret,請務必區(qū)分開。
     * 如果是在阿里云ECS內網訪問,無需初始化RpcHook,服務端會根據(jù)內網VPC信息智能獲取。
     * 如果實例類型為Serverless實例,公網訪問必須設置實例的用戶名密碼,當開啟內網免身份識別時,內網訪問可以不設置用戶名和密碼。
     */
    private static RPCHook getAclRPCHook() {
        return new AclClientRPCHook(new SessionCredentials("INSTANCE USER NAME", "INSTANCE PASSWORD"));
    }

    public static void main(String[] args) throws MQClientException {
        // 使用公網接入點時,需要配置RPCHook。
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(getAclRPCHook());
        // 使用VPC接入點時,無需配置RPCHook。
        // 如果實例類型為Serverless實例,則必須配置RPCHook。
        // DefaultMQPushConsumer consumer = new DefaultMQPushConsumer();

        //您在消息隊列RocketMQ版控制臺創(chuàng)建的Group ID。
        consumer.setConsumerGroup("YOUR GROUP ID");

        // 設置接入方式為阿里云,在使用云上消息軌跡的時候,需要設置此項;如果不開啟消息軌跡功能,則不需要運行此項。
        consumer.setAccessChannel(AccessChannel.CLOUD);

        // 設置為您從阿里云消息隊列RocketMQ版控制臺獲取的接入點信息,類似“rmq-cn-XXXX.rmq.aliyuncs.com:8080”。
        // 注意!!!直接填寫控制臺提供的域名和端口即可,請勿添加http://或https://前綴標識,也不要用IP解析地址。
        consumer.setNamesrvAddr("YOUR ACCESS POINT");
        // 設置為您在阿里云云消息隊列 RocketMQ 版控制臺上創(chuàng)建的Topic。
        consumer.subscribe("YOUR TOPIC", "*");
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                            ConsumeConcurrentlyContext context) {
                System.out.printf("Receive New Messages: %s %n", msgs);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
    }
}

順序消息收發(fā)示例

發(fā)送順序消息

import java.util.List;

import org.apache.rocketmq.acl.common.AclClientRPCHook;
import org.apache.rocketmq.acl.common.SessionCredentials;
import org.apache.rocketmq.client.AccessChannel;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.RPCHook;
import org.apache.rocketmq.remoting.common.RemotingHelper;

public class RocketMQOrderProducer {
    /**
     * 如果是使用公網接入點訪問,則必須設置RpcHook,里面填寫實例的用戶名和密碼。實例用戶名和密碼在控制臺訪問控制的智能身份識別頁簽中獲取。
     * 注意!!!這里填寫的不是阿里云賬號的AccessKey ID和AccessKey Secret,請務必區(qū)分開。
     * 如果是在阿里云ECS內網訪問,無需初始化RpcHook,服務端會根據(jù)內網VPC信息智能獲取。
     * 如果實例類型為Serverless實例,公網訪問必須設置實例的用戶名密碼,當開啟內網免身份識別時,內網訪問可以不設置用戶名和密碼。
     */
    private static RPCHook getAclRPCHook() {
        return new AclClientRPCHook(new SessionCredentials("INSTANCE USER NAME", "INSTANCE PASSWORD"));
    }

    public static void main(String[] args) throws MQClientException {
        // 使用公網接入點時,需要配置RPCHook。
        DefaultMQProducer producer = new DefaultMQProducer(getAclRPCHook());
        // 使用VPC接入點時,無需配置RPCHook。
        // 如果實例類型為Serverless實例,則必須配置RPCHook。
        // DefaultMQProducer producer = new DefaultMQProducer();

        //您在消息隊列RocketMQ版控制臺創(chuàng)建的Group ID。
        producer.setProducerGroup("YOUR GROUP ID");

        // 設置接入方式為阿里云,在使用云上消息軌跡的時候,需要設置此項;如果不開啟消息軌跡功能,則不需要運行此項。
        producer.setAccessChannel(AccessChannel.CLOUD);

        // 設置為您從阿里云消息隊列RocketMQ版控制臺獲取的接入點信息,類似“rmq-cn-XXXX.rmq.aliyuncs.com:8080”。
        // 注意!!!直接填寫控制臺提供的域名和端口即可,請勿添加http://或https://前綴標識,也不要用IP解析地址。
        producer.setNamesrvAddr("YOUR ACCESS POINT");
        producer.start();

        for (int i = 0; i < 128; i++) {
            try {
                int orderId = i % 10;
                Message msg = new Message("YOUR ORDER TOPIC",
                        "YOUR MESSAGE TAG",
                        "OrderID188",
                        "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
                // 注意!!!請務必設置該配置項,順序消息才能均勻分布到各隊列中。
                // 5.x版本下面一行代碼可以替換為 msg.putUserProperty(MessageConst.PROPERTY_SHARDING_KEY, orderId + "");
                msg.putUserProperty("__SHARDINGKEY", orderId + "");
                SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
                    @Override
                    public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
                        // 選擇適合自己的分區(qū)選擇算法,保證同一個參數(shù)得到的結果相同。
                        Integer id = (Integer) arg;
                        int index = id % mqs.size();
                        return mqs.get(index);
                    }
                }, orderId);

                System.out.printf("%s%n", sendResult);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        producer.shutdown();
    }
}

訂閱順序消息

import org.apache.rocketmq.acl.common.AclClientRPCHook;
import org.apache.rocketmq.acl.common.SessionCredentials;
import org.apache.rocketmq.client.AccessChannel;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.RPCHook;

import java.util.List;

public class RocketMQOrderConsumer {
    private static RPCHook getAclRPCHook() {
        /**
         * 如果是使用公網接入點訪問,則必須設置RpcHook,里面填寫實例的用戶名和密碼。實例用戶名和密碼在控制臺訪問控制的智能身份識別頁簽中獲取。
         * 注意!!!這里填寫的不是阿里云賬號的AccessKey ID和AccessKey Secret,請務必區(qū)分開。
         * 如果是在阿里云ECS內網訪問,無需初始化RpcHook,服務端會根據(jù)內網VPC信息智能獲取。
         * 如果實例類型為Serverless實例,公網訪問必須設置實例的用戶名密碼,當開啟內網免身份識別時,內網訪問可以不設置用戶名和密碼。
         */
        return new AclClientRPCHook(new SessionCredentials("INSTANCE USER NAME", "INSTANCE PASSWORD"));
    }

    public static void main(String[] args) throws MQClientException {
        // 使用公網接入點時,需要配置RPCHook。
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(getAclRPCHook());
        // 使用VPC接入點時,無需配置RPCHook。
        // 如果實例類型為Serverless實例,則必須配置RPCHook。
        // DefaultMQPushConsumer consumer = new DefaultMQPushConsumer();

        //您在消息隊列RocketMQ版控制臺創(chuàng)建的Group ID。
        consumer.setConsumerGroup("YOUR GROUP ID");

        // 設置接入方式為阿里云,在使用云上消息軌跡的時候,需要設置此項;如果不開啟消息軌跡功能,則不需要運行此項。
        consumer.setAccessChannel(AccessChannel.CLOUD);

        // 設置為您從阿里云消息隊列RocketMQ版控制臺獲取的接入點信息,類似“rmq-cn-XXXX.rmq.aliyuncs.com:8080”。
        // 注意!!!直接填寫控制臺提供的域名和端口即可,請勿添加http://或https://前綴標識,也不要用IP解析地址。
        consumer.setNamesrvAddr("YOUR ACCESS POINT");
        consumer.subscribe("YOUR ORDER TOPIC", "*");

        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        consumer.registerMessageListener(new MessageListenerOrderly() {

            @Override
            public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
                context.setAutoCommit(true);
                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                // 消費失敗則掛起重試返回:ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT。
                return ConsumeOrderlyStatus.SUCCESS;
            }
        });

        consumer.start();
        System.out.printf("Consumer Started.%n");
    }
}

定時/延時消息示例代碼

發(fā)送定時/延時消息

import org.apache.rocketmq.acl.common.AclClientRPCHook;
import org.apache.rocketmq.acl.common.SessionCredentials;
import org.apache.rocketmq.client.AccessChannel;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.RPCHook;
import org.apache.rocketmq.remoting.common.RemotingHelper;

public class RocketMQDelayProducer {
    /**
     * 如果是使用公網接入點訪問,則必須設置RpcHook,里面填寫實例的用戶名和密碼。實例用戶名和密碼在控制臺訪問控制的智能身份識別頁簽中獲取。
     * 注意!!!這里填寫的不是阿里云賬號的AccessKey ID和AccessKey Secret,請務必區(qū)分開。
     * 如果是在阿里云ECS內網訪問,無需初始化RpcHook,服務端會根據(jù)內網VPC信息智能獲取。
     * 如果實例類型為Serverless實例,公網訪問必須設置實例的用戶名密碼,當開啟內網免身份識別時,內網訪問可以不設置用戶名和密碼。
     */
    private static RPCHook getAclRPCHook() {
        return new AclClientRPCHook(new SessionCredentials("INSTANCE USER NAME", "INSTANCE PASSWORD"));
    }

    public static void main(String[] args) throws MQClientException {
        // 使用公網接入點時,需要配置RPCHook。
        DefaultMQProducer producer = new DefaultMQProducer(getAclRPCHook());
        // 使用VPC接入點時,無需配置RPCHook。
        // 如果實例類型為Serverless實例,則必須配置RPCHook。
        // DefaultMQProducer producer = new DefaultMQProducer();

        //您在消息隊列RocketMQ版控制臺創(chuàng)建的Group ID。
        producer.setProducerGroup("YOUR GROUP ID");

        // 設置接入方式為阿里云,在使用云上消息軌跡的時候,需要設置此項;如果不開啟消息軌跡功能,則不需要運行此項。
        producer.setAccessChannel(AccessChannel.CLOUD);

        // 設置為您從阿里云消息隊列RocketMQ版控制臺獲取的接入點信息,類似“rmq-cn-XXXX.rmq.aliyuncs.com:8080”。
        // 注意!!!直接填寫控制臺提供的域名和端口即可,請勿添加http://或https://前綴標識,也不要用IP解析地址。
        producer.setNamesrvAddr("YOUR ACCESS POINT");
        producer.start();

        for (int i = 0; i < 128; i++) {
            try {
                // 設置為您在云消息隊列 RocketMQ 版控制臺創(chuàng)建的Topic。
                Message msg = new Message("YOUR TOPIC",
                        // 設置消息的Tag。
                        "YOUR MESSAGE TAG",
                        // 消息內容。
                        "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
                // 發(fā)送延時消息,需要設置延時時間,單位毫秒(ms),消息將在指定延時時間后投遞,例如消息將在3秒后投遞。
                long delayTime = System.currentTimeMillis() + 3000;
                msg.putUserProperty("__STARTDELIVERTIME", String.valueOf(delayTime));

                // 若需要發(fā)送定時消息,則需要設置定時時間,消息將在指定時間進行投遞,例如消息將在2021-08-10 18:45:00投遞。
                // 定時時間格式為:yyyy-MM-dd HH:mm:ss,若設置的時間戳在當前時間之前,則消息將被立即投遞給Consumer。
                // longtimeStamp=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-08-10 18:45:00").getTime();
                // msg.putUserProperty("__STARTDELIVERTIME",String.valueOf(timeStamp));
                SendResult sendResult = producer.send(msg);
                System.out.printf("%s%n", sendResult);
            } catch (Exception e) {
                // 消息發(fā)送失敗,需要進行重試處理,可重新發(fā)送這條消息或持久化這條數(shù)據(jù)進行補償處理。
                System.out.println(new Date() + " Send mq message failed.");
                e.printStackTrace();
            }
        }

        // 在應用退出前,銷毀Producer對象。
        // 注意:銷毀Producer對象可以節(jié)約系統(tǒng)內存,若您需要頻繁發(fā)送消息,則無需銷毀Producer對象。
        producer.shutdown();
    }
}

訂閱定時/延時消息

訂閱定時/延時消息的示例代碼和訂閱普通消息相同,請參見訂閱普通消息

事務消息示例代碼

發(fā)送事務消息

  1. 發(fā)送半事務消息(Half Message)及執(zhí)行本地事務,示例代碼如下。

    import org.apache.rocketmq.acl.common.AclClientRPCHook;
    import org.apache.rocketmq.acl.common.SessionCredentials;
    import org.apache.rocketmq.client.AccessChannel;
    import org.apache.rocketmq.client.exception.MQClientException;
    import org.apache.rocketmq.client.producer.LocalTransactionExecuter;
    import org.apache.rocketmq.client.producer.LocalTransactionState;
    import org.apache.rocketmq.client.producer.SendResult;
    import org.apache.rocketmq.client.producer.TransactionMQProducer;
    import org.apache.rocketmq.common.message.Message;
    import org.apache.rocketmq.remoting.RPCHook;
    import org.apache.rocketmq.remoting.common.RemotingHelper;
    
    public class RocketMQTransactionProducer {
    
        private static RPCHook getAclRPCHook() {
            /**
             * 如果是使用公網接入點訪問,則必須設置RpcHook,里面填寫實例的用戶名和密碼。實例用戶名和密碼在控制臺訪問控制的智能身份識別頁簽中獲取。
             * 注意!!!這里填寫的不是阿里云賬號的AccessKey ID和AccessKey Secret,請務必區(qū)分開。
             * 如果是在阿里云ECS內網訪問,無需初始化RpcHook,服務端會根據(jù)內網VPC信息智能獲取。
             * 如果實例類型為Serverless實例,公網訪問必須設置實例的用戶名密碼,當開啟內網免身份識別時,內網訪問可以不設置用戶名和密碼。
             */
            return new AclClientRPCHook(new SessionCredentials("INSTANCE USER NAME", "INSTANCE PASSWORD"));
        }
    
        public static void main(String[] args) throws MQClientException {
            // 使用公網接入點時,需要配置RPCHook。
            // 您在消息隊列RocketMQ版控制臺創(chuàng)建的Group ID。注意:事務消息的Group ID不能與其他類型消息的Group ID共用。
            TransactionMQProducer transactionMQProducer = new TransactionMQProducer("YOUR TRANSACTION GROUP ID", getAclRPCHook());
            // 使用VPC接入點時,無需配置RPCHook。
            // 如果實例類型為Serverless實例,則必須配置RPCHook。
            // TransactionMQProducer transactionMQProducer = new TransactionMQProducer("YOUR TRANSACTION GROUP ID");
    
            // 設置接入方式為阿里云,在使用云上消息軌跡的時候,需要設置此項;如果不開啟消息軌跡功能,則不需要運行此項。
            transactionMQProducer.setAccessChannel(AccessChannel.CLOUD);
    
            // 設置為您從阿里云消息隊列RocketMQ版控制臺獲取的接入點信息,類似“rmq-cn-XXXX.rmq.aliyuncs.com:8080”。
            // 注意!!!直接填寫控制臺提供的域名和端口即可,請勿添加http://或https://前綴標識,也不要用IP解析地址。
            transactionMQProducer.setNamesrvAddr("YOUR ACCESS POINT");
            transactionMQProducer.setTransactionCheckListener(new LocalTransactionCheckerImpl());
            transactionMQProducer.start();
    
            for (int i = 0; i < 10; i++) {
                try {
                    Message message = new Message("YOUR TRANSACTION TOPIC",
                            "YOUR MESSAGE TAG",
                            "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
                    SendResult sendResult = transactionMQProducer.sendMessageInTransaction(message, new LocalTransactionExecuter() {
                        @Override
                        public LocalTransactionState executeLocalTransactionBranch(Message msg, Object arg) {
                            System.out.println("開始執(zhí)行本地事務: " + msg);
                            return LocalTransactionState.UNKNOW;
                        }
                    }, null);
                    assert sendResult != null;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
  2. 提交事務消息狀態(tài),示例代碼如下。

    import org.apache.rocketmq.client.producer.LocalTransactionState;
    import org.apache.rocketmq.client.producer.TransactionCheckListener;
    import org.apache.rocketmq.common.message.MessageExt;
    
    // 云消息隊列 RocketMQ 版發(fā)送事務消息本地Check接口實現(xiàn)類。
    public class LocalTransactionCheckerImpl implements TransactionCheckListener {
        // 本地事務Checker。更多信息,請參見事務消息。
        @Override public LocalTransactionState checkLocalTransactionState(MessageExt msg) {
            System.out.println("收到事務消息的回查請求, MsgId: " + msg.getMsgId());
            return LocalTransactionState.COMMIT_MESSAGE;
        }
    
    }

訂閱事務消息

訂閱事務消息的示例代碼和訂閱普通消息一樣,請參見訂閱普通消息