阿里云RocketMQ的订阅类Subscription的HashCode及Equals的设计问题

题外话

设计并实现了一个消息投递平台,可以实现对不同业务场景的消息进行订阅,并将这些接收的消息根据业务场景需要,将其转投递到外部的ES、RocketMQ、Get API、Post API以及Spring Cloud类型的API,让应用以最小的接入及改造成本,实现应用的解耦。

问题

本次发现的问题为源消息中间为阿里云的RocketMQ,当我们在针对同一个Topic的不同Tag进行消息订阅的时候,发现最终都只能够订阅一个Tag,其它Tag的消息不能够订阅,以下代码是组装消息订阅的Map实现:

如此时config对像中包括了两个记录,他们的Topic名称都相同,只是Tag不同,但是最终生成的Map<Subscription,MessageListener>却只有一条记录,跟踪其原因发现问题出现在对像com.aliyun.openservices.ons.api.bean.Subscription的Hashcode的设计实现,如下所示:

其Hashcode的生成只与topic有关,与tag没有一毛钱的关系,这就是为什么针对相同的Topic订单不同的tag时,只最终只能够订阅一个tag的原因。

Subscription的equals()方法也只与topic有关:

要实现Python接入阿里云的发布订阅功能,你需要先进行以下几个步骤: 1. 创建阿里云账号并开通消息服务。 2. 安装aliyun-python-sdk-core和aliyun-python-sdk-mns模块。 3. 获取阿里云账号的AccessKey ID和AccessKey Secret,并创建MNS客户端。 4. 创建主题和订阅。 下面是Python代码示例: ```python from aliyunsdkcore.client import AcsClient from aliyunsdkcore.auth.credentials import AccessKeyCredential from aliyunsdkmns.request.v20150629 import * from aliyunsdkmns.request.v20150629.PublishMessageRequest import * from aliyunsdkmns.request.v20150629.SubscribeRequest import * # 阿里云账号的AccessKey ID和AccessKey Secret access_key_id = 'your_access_key_id' access_key_secret = 'your_access_key_secret' # 创建MNS客户端 cred = AccessKeyCredential(access_key_id, access_key_secret) client = AcsClient("", "", "cn-hangzhou", credential=cred) # 创建主题和订阅 topic_name = 'test_topic' subscription_name = 'test_subscription' request = CreateTopicRequest.CreateTopicRequest() request.set_topic_name(topic_name) client.do_action_with_exception(request) request = SubscribeRequest.SubscribeRequest() request.set_topic_name(topic_name) request.set_subscription_name(subscription_name) request.set_notify_content_format('JSON') request.set_endpoint('your_endpoint') client.do_action_with_exception(request) # 发布消息 message = 'Hello, World!' request = PublishMessageRequest.PublishMessageRequest() request.set_topic_name(topic_name) request.set_message_body(message) client.do_action_with_exception(request) # 接收消息 request = ReceiveMessageRequest.ReceiveMessageRequest() request.set_subscription_name(subscription_name) response = client.do_action_with_exception(request) messages = response.decode('utf-8') print(messages) ``` 其中,access_key_id和access_key_secret需要替换为你自己的阿里云账号的AccessKey ID和AccessKey Secret,topic_name和subscription_name可以根据自己的需求自定义,endpoint需要替换为你自己的接收消息的URL。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值