【Bug Report】报告 rocketmq-v5-client-spring-boot 的 3 个 Bug
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 52/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 静か
- 技術スタック
- java, spring-boot
- 領域
- backend
調査の方向性
ExtTemplateResetConfiguration.java と ExtConsumerResetConfiguration.java の validate および registerTemplate から始め、次に RocketMQUtil.java の getAndWrapMessage を調べます。報告されているフォーマット、Bean 名の検証、メッセージキーの動作を追跡し、関連するモジュールテストを実行します。3 つのケースすべてが意図したとおりに動作し、Spring Boot クライアント統合にリグレッションがないことを完了の条件とします。
索引モデルが issue の本文から書いたものです。
説明
BUG REPORT
在使用的过程中,发现了 rocketmq-v5-client-spring-boot 的以下 3 个Bug:
String.format 应该用 '%' 而不是 '{}' 作为占位符;另外,也不存在文本中提到的 '@ExtTemplateConfiguration' 注解
private void validate(ExtProducerResetConfiguration annotation,
GenericApplicationContext genericApplicationContext) {
if (genericApplicationContext.isBeanNameInUse(annotation.value())) {
// ! BUG !
// String.format 应该用 '%' 而不是 '{}' 作为占位符;另外,也不存在文本中提到的 '@ExtTemplateConfiguration' 注解
throw new BeanDefinitionValidationException(String.format("Bean {} has been used in Spring Application Context, " +
"please check the @ExtTemplateConfiguration",
annotation.value()));
}
}
private void registerTemplate(String beanName, Object bean) 中调用 validate(annotation, genericApplicationContext) 检测beanName 是否已存在:
private void validate(ExtProducerResetConfiguration annotation,
GenericApplicationContext genericApplicationContext) {
if (genericApplicationContext.isBeanNameInUse(annotation.value())) {
throw new BeanDefinitionValidationException(String.format("Bean {} has been used in Spring Application Context, " +
"please check the @ExtTemplateConfiguration",
annotation.value()));
}
}
以下 template 定义会导致导致 validate() 校验失败:
@ExtProducerResetConfiguration(value = FifoPruducerTemplate.BEAN_NAME, topic = "${rocketmq-fifo.simple-consumer.topic}")
public class FifoPruducerTemplate extends RocketMQClientTemplate
{
public static final String BEAN_NAME = "fifoPruducerTemplate";
}
@ExtConsumerResetConfiguration
(
value = FifoConsumerTemplate.BEAN_NAME,
topic = "${rocketmq-fifo.simple-consumer.topic}"
)
public class FifoConsumerTemplate extends SoaRocketMQClientTemplate
{
public static final String BEAN_NAME = "fifoConsumerTemplate";
}
因为 FifoPruducerTemplate、FifoConsumerTemplate 使用了 fifoPruducerTemplate 和 fifoConsumerTemplate 这个beanName,validate() 检测到存在这个beanName。因此报错。
唯一的处理办法就是不能定义注解的value属性,因为只要value有值就过不了validate()校验。
validate() 校验似乎是多余的,可以去掉;即使不去掉也应排除自身的 beanName。
调用 keys.toString() 有问题:意味着无论 keys 参数是逗号分隔的字符串,或者是字符串数组,传入 messageBuilder.setKeys() 后都变为单个字符串。这似乎与 messageBuilder.setKeys() 的设计目标不一致。
public static org.apache.rocketmq.client.apis.message.Message getAndWrapMessage(
String destination, MessageHeaders headers, byte[] payloads, Duration messageDelayTime, String messageGroup) {
if (payloads == null || payloads.length < 1) {
return null;
}
if (destination == null || destination.length() < 1) {
return null;
}
String[] tempArr = destination.split(":", 2);
final ClientServiceProvider provider = ClientServiceProvider.loadService();
org.apache.rocketmq.client.apis.message.MessageBuilder messageBuilder = null;
// resolve header
if (Objects.nonNull(headers) && !headers.isEmpty()) {
Object keys = headers.get(RocketMQHeaders.KEYS);
if (ObjectUtils.isEmpty(keys)) {
keys = headers.get(toRocketHeaderKey(RocketMQHeaders.KEYS));
}
messageBuilder = provider.newMessageBuilder()
.setTopic(tempArr[0]);
if (tempArr.length > 1) {
messageBuilder.setTag(tempArr[1]);
}
if (StringUtils.hasLength(messageGroup)) {
messageBuilder.setMessageGroup(messageGroup);
}
if (!ObjectUtils.isEmpty(keys)) {
// ! BUG !
// 这里调用 keys.toString() 有问题:意味着无论 keys 参数是逗号分隔的字符串,或者是字符串数组,传入 messageBuilder.setKeys() 后都变为单个字符串。这似乎与 messageBuilder.setKeys() 的设计目标不一致。
messageBuilder.setKeys(keys.toString());
}
if (Objects.nonNull(messageDelayTime)) {
messageBuilder.setDeliveryTimestamp(System.currentTimeMillis() + messageDelayTime.toMillis());
}
messageBuilder.setBody(payloads);
org.apache.rocketmq.client.apis.message.MessageBuilder builder = messageBuilder;
headers.forEach((key, value) -> builder.addProperty(key, String.valueOf(value)));
}
return messageBuilder.build();
}
- 主要言語
- Java
- スター
- 2.3k
- フォーク
- 941
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/rocketmq-spring のほかの issue
-
[Bug] RocketMQClientTemplate.receiveAsync closes the shared SimpleConsumer, breaking all subsequent operations対応中かも @wang-jiahua が 60 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
apache/rocketmq-spring#780 · コメント 3 件 ·
-
编译报错オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
apache/rocketmq-spring#692 · コメント 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
apache/rocketmq-spring#678 · コメント 2 件 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
apache/rocketmq-spring#670 · コメント 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
apache/rocketmq-spring#609 · コメント 3 件 ·
apache/rocketmq-spring の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 3 日以内に返信
-
A proxy that fails to start logs a RejectedExecutionException stack trace from its shutdown hookオープンfollow-up
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
Sanne/incus-spawn#1953 ·
メンテナーはふだん 1 日以内に返信
-
Bug
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
HexaHexes/ability-battlewills#37 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
Shweit/EtherealPortals#30 ·