【SpringBoot】阿里云消息队列RcoketMQ消费者代码示例

项目中使用到了mq,使用的是阿里云消息队列,作为消费者进行消费,记录下相关的代码。

阿里云消息队列maven依赖

			<mq.version>1.8.4.Final</mq.version>

            <dependency>
                <groupId>com.aliyun.openservices</groupId>
                <artifactId>ons-client</artifactId>
                <version>${mq.version}</version>
            </dependency>

mq配置:

# producer
mq.producer.properties.AccessKey=test
mq.producer.properties.SecretKey=test
mq.producer.properties.NAMESRV_ADDR=addr
mq.consumer.properties.ProducerId=producerId

# consumer
mq.consumer.properties.AccessKey=accesskey
mq.consumer.properties.SecretKey=SecretKey
mq.consumer.properties.NAMESRV_ADDR=add
mq.consumer.properties.ConsumerId=consumerId
mq.consumer.properties.ConsumeThreadNums=25

# subscription
mq.subscription.settleCallback.topic=TOPIC
# expression即Tag,可以设置成具体的Tag,如 taga||tagb||tagc,也可设置成*。 *仅代表订阅所有Tag,不支持通配
mq.subscription.settleCallback.expression= "*"

mq配置类:

@Data
@ConfigurationProperties(prefix = "mq")
public class MqConfigProperties {

    private Producer producer;
    private Consumer consumer;
    private Map<String, Subscription> subscription;

    @Data
    public static class Producer {
        private Properties properties;
    }

    @Data
    public static class Consumer {
        private Properties properties;
    }

}
@Slf4j
@Configuration
@EnableConfigurationProperties(MqConfigProperties.class)
public class MqAutoConfiguration {

    @Bean(initMethod = "start", destroyMethod = "shutdown")
    public ProducerBean mqProducer(MqConfigProperties mqConfigProperties) {
        ProducerBean bean = new ProducerBean();
        bean.setProperties(mqConfigProperties.getProducer().getProperties());
        return bean;
    }

    @Bean(initMethod = "start", destroyMethod = "shutdown")
    public ConsumerBean consumerMessageListener(MqConfigProperties mqConfigProperties,
    											AutoCheckPayMqListener autoCheckPayMqListener,
                                                SettleCallbackMqListener settleCallbackMqListener) {
        ConsumerBean bean = new ConsumerBean();
        bean.setProperties(mqConfigProperties.getConsumer().getProperties());
        Map<Subscription, MessageListener> subscriptionTable = new HashMap<>(3);
        //消息订阅,如果消费多个消息进行配置
               
    //    public static final String SETTLE_CALLBACK = "settleCallback";
	//    public static final String MQ_CONFIG_PAY_QUERY = "payQuery";
               subscriptionTable.put(mqConfigProperties.getSubscription().get(Constant.MQ_CONFIG_PAY_QUERY), autoCheckPayMqListener);
subscriptionTable.put(mqConfigProperties.getSubscription().get(Constants.SETTLE_CALLBACK), settleCallbackMqListener);
        bean.setSubscriptionTable(subscriptionTable);
        //日志
log.info("mq-consumer Listener subscription Table: ");
        subscriptionTable.forEach((subscription, messageListener) -> log.info("subscription: {} , messageListener: {}",
                JSON.toJSONString(subscription), JSON.toJSONString(messageListener)));
        return bean;
    }
}

mq信息处理:

@Service("settleCallbackMqListener")
public class SettleCallbackMqListener implements MessageListener {

    @Resource
    private PaymentTradeService paymentTradeService;

    @Override
    public Action consume(Message message, ConsumeContext consumeContext) {
        try {
            String data = new String(message.getBody(), StandardCharsets.UTF_8);
              // todo 
        } catch (Exception e) {
            // todo 
        }
        return Action.CommitMessage;
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现延迟消息队列可以使用 Redis 的 sorted set 数据结构,其中 score 表示消息的执行时间戳,member 表示消息内容。每隔一段时间轮询一次 sorted set,将 score 小于当前时间的消息取出来执行即可。 下面是一个基于 Spring Boot 和 Redis 的简单实现代码: 首先引入 Redis 相关依赖,在 pom.xml 文件中添加以下内容: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 然后创建一个消息实体类 DelayMessage,用于存储消息内容和执行时间戳: ```java public class DelayMessage { private String message; private long executeTime; // getter 和 setter 方法省略 } ``` 接着创建一个 Redis 延迟消息队列的服务 DelayQueueService,其中包含添加消息和轮询消息的方法: ```java @Service public class DelayQueueService { private static final String DELAY_QUEUE_KEY = "delay_queue"; @Autowired private RedisTemplate<String, Object> redisTemplate; // 添加延迟消息 public void addDelayMessage(DelayMessage message) { redisTemplate.opsForZSet().add(DELAY_QUEUE_KEY, message, message.getExecuteTime()); } // 轮询延迟消息 public List<DelayMessage> pollDelayMessage() { long currentTime = System.currentTimeMillis(); Set<Object> messages = redisTemplate.opsForZSet().rangeByScore(DELAY_QUEUE_KEY, 0, currentTime); if (messages != null && !messages.isEmpty()) { List<DelayMessage> result = new ArrayList<>(); for (Object message : messages) { redisTemplate.opsForZSet().remove(DELAY_QUEUE_KEY, message); result.add((DelayMessage) message); } return result; } return null; } } ``` 最后在需要使用延迟消息队列的地方调用 addDelayMessage 方法添加消息,轮询消息可以单独开一个线程或者使用定时任务实现。 注意:以上代码只是一个简单的示例,实际使用中需要考虑分布式环境下的并发问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值