springboot,接阿里云消息rocketmq (一)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37804737/article/details/86560829

首先上一张rocketmq的架构图:
在这里插入图片描述
Rocket主要使用两个组件:Name Server和Broker。
Name Server:mq的寻址服务。用于把mq的Broker路由信息做聚合。客户端通过name server去获取topic的路由信息,从而决定对哪些Broker做连接。nameserver是无状态的,互相之间不通信息,客户端寻找nameserver是,随机选一个进行连接,nameserver中所有状态都由Broker上报。
Broker:用于消息存储、转发。主从架构,同步策略可以配置。Broker向所有name server建立长连接,注册topic信息。
在这里插入图片描述
发送消息需要构造一个Producer,阿里云文档给出了示例:

       Properties properties = new Properties();
        // AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建
        properties.put(PropertyKeyConst.AccessKey,"XXX");
        // SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建
        properties.put(PropertyKeyConst.SecretKey, "XXX");
        //设置发送超时时间,单位毫秒
        properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
        // 设置 TCP 接入域名,进入控制台的实例管理页面的“获取接入点信息”区域查看
        properties.put(PropertyKeyConst.NAMESRV_ADDR,
          "XXX");
        Producer producer = ONSFactory.createProducer(properties);

然后构造Message :

 Message msg = new Message( //
                // Message 所属的 Topic
                "TopicTestMQ",
                // Message Tag 可理解为 Gmail 中的标签,对消息进行再归类,方便 Consumer 指定过滤条件在消息队列 RocketMQ 的服务器过滤
                "TagA",
                // Message Body 可以是任何二进制形式的数据, 消息队列 RocketMQ 不做任何干预,
                // 需要 Producer 与 Consumer 协商好一致的序列化和反序列化方式
                "Hello MQ".getBytes());
            // 设置代表消息的业务关键属性,请尽可能全局唯一。
            // 以方便您在无法正常收到消息情况下,可通过阿里云服务器管理控制台查询消息并补发
            // 注意:不设置也不会影响消息正常收发
            msg.setKey("ORDERID_" + i);

最后调用producer的发送api即可。

基本的消息收发非常的简单,下面我们来和spring结合,利用spring进行管理。

使用 @Configuration声明配置类,使用@Value(${mq.topic.user})取yml中配置的属性。

@Configuration
public class BusMqConfig {
    @Value("${mq.topic.user}")
    private String topic;
    @Value("${mq.producerId.user}")
    private String producerId;
    @Value("${mq.consumerId.user}")
    private String consumerId;
    @Value("${mq.accesskey}")
    private String accesskey;
    @Value("${mq.secretkey}")
    private String secretkey;
    @Value("${mq.onsaddr}")
    private String onsaddr;
    public Properties getConsumerProperties() {
        Properties consumerProperties = new Properties();
        consumerProperties.setProperty(PropertyKeyConst.ConsumerId, consumerId);
        consumerProperties.setProperty(PropertyKeyConst.AccessKey, accesskey);
        consumerProperties.setProperty(PropertyKeyConst.SecretKey, secretkey);
        consumerProperties.setProperty(PropertyKeyConst.ONSAddr, onsaddr);
        return consumerProperties;
    }
    public Properties getProducerProperties() {
        Properties producerProperties = new Properties();
        producerProperties.setProperty(PropertyKeyConst.ProducerId, producerId);
        producerProperties.setProperty(PropertyKeyConst.AccessKey, accesskey);
        producerProperties.setProperty(PropertyKeyConst.SecretKey, secretkey);
        producerProperties.setProperty(PropertyKeyConst.ONSAddr, onsaddr);
        return producerProperties;
    }

    public String getTopic() {
        return topic;
    }

    public void setTopic(String topic) {
        this.topic = topic;
    }
}

利用spring的扩展点,来构造Consumer:

@Component
@ComponentScan
public class MqConsumer implements InitializingBean, DisposableBean{

	@Autowired
	PlatfromDao platfromDao;

    @Autowired
    BusMqConfig busMqConfig;

    private Consumer busConsumer;

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("consumer initializing");
        busConsumer = ONSFactory.createConsumer(busMqConfig.getConsumerProperties());
       // busConsumer.start();
        System.out.println("consumer initialized");
    }
    public void start(){
        busConsumer.start();
    }
    public void onMessage(){
        busConsumer.subscribe(busMqConfig.getTopic(),"*", new MessageListener() {
            @Override
            public Action consume(Message message, ConsumeContext context) {
               // System.out.println(JSON.toJSONString(message));
                System.out.println(platfromDao.listArticleGroup().toString());
                System.out.println(new String(message.getBody()));
                
                
                return Action.CommitMessage;
            }
        });
    }

    @Override
    public void destroy() throws Exception {
        busConsumer.shutdown();
        System.out.println("consumer shutdown");
    }

}

借助CommandLineRunner来开启Consummer:

@Component
public class ListenerConfig implements CommandLineRunner{
    @Autowired
    MqConsumer mqConsumer;
    @Override
    public void run(String... strings) throws Exception {
        System.out.println("start consumer");
        mqConsumer.start();
        mqConsumer.onMessage();
    }
}

展开阅读全文

没有更多推荐了,返回首页