Skip to content

Commit 206e782

Browse files
committed
Optimize getMessageType and getMethodParameter methods in DefaultRocketMQListenerContainer
1 parent c1dbf87 commit 206e782

File tree

2 files changed

+23
-44
lines changed

2 files changed

+23
-44
lines changed

rocketmq-spring-boot/src/main/java/org/apache/rocketmq/spring/support/DefaultRocketMQListenerContainer.java

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.springframework.context.ApplicationContextAware;
5959
import org.springframework.context.SmartLifecycle;
6060
import org.springframework.core.MethodParameter;
61+
import org.springframework.core.ResolvableType;
6162
import org.springframework.messaging.Message;
6263
import org.springframework.messaging.MessageHeaders;
6364
import org.springframework.messaging.converter.MessageConversionException;
@@ -66,6 +67,7 @@
6667
import org.springframework.messaging.support.MessageBuilder;
6768
import org.springframework.util.Assert;
6869
import org.springframework.util.MimeTypeUtils;
70+
import org.springframework.util.ReflectionUtils;
6971

7072
@SuppressWarnings("WeakerAccess")
7173
public class DefaultRocketMQListenerContainer implements InitializingBean,
@@ -553,61 +555,36 @@ private Object doConvertMessage(MessageExt messageExt) {
553555

554556
private MethodParameter getMethodParameter() {
555557
Class<?> targetClass;
558+
Class<?> consumerInterface;
556559
if (rocketMQListener != null) {
557560
targetClass = AopProxyUtils.ultimateTargetClass(rocketMQListener);
561+
consumerInterface = RocketMQListener.class;
558562
} else {
559563
targetClass = AopProxyUtils.ultimateTargetClass(rocketMQReplyListener);
564+
consumerInterface = RocketMQReplyListener.class;
560565
}
561-
Type messageType = this.getMessageType();
562-
Class clazz = null;
563-
if (messageType instanceof ParameterizedType && messageConverter instanceof SmartMessageConverter) {
564-
clazz = (Class) ((ParameterizedType) messageType).getRawType();
565-
} else if (messageType instanceof Class) {
566-
clazz = (Class) messageType;
567-
} else {
568-
throw new RuntimeException("parameterType:" + messageType + " of onMessage method is not supported");
569-
}
570-
try {
571-
final Method method = targetClass.getMethod("onMessage", clazz);
572-
return new MethodParameter(method, 0);
573-
} catch (NoSuchMethodException e) {
574-
e.printStackTrace();
575-
throw new RuntimeException("parameterType:" + messageType + " of onMessage method is not supported");
576-
}
566+
ResolvableType resolvableType = ResolvableType.forClass(targetClass).as(consumerInterface);
567+
Class<?> methodParameterType = resolvableType.getGeneric().resolve();
568+
Method onMessage = ReflectionUtils.findMethod(targetClass, "onMessage", methodParameterType);
569+
return MethodParameter.forExecutable(onMessage, 0);
577570
}
578571

572+
579573
private Type getMessageType() {
580574
Class<?> targetClass;
575+
Class<?> consumerInterface;
581576
if (rocketMQListener != null) {
582577
targetClass = AopProxyUtils.ultimateTargetClass(rocketMQListener);
578+
consumerInterface = RocketMQListener.class;
583579
} else {
584580
targetClass = AopProxyUtils.ultimateTargetClass(rocketMQReplyListener);
581+
consumerInterface = RocketMQReplyListener.class;
585582
}
586-
Type matchedGenericInterface = null;
587-
while (Objects.nonNull(targetClass)) {
588-
Type[] interfaces = targetClass.getGenericInterfaces();
589-
if (Objects.nonNull(interfaces)) {
590-
for (Type type : interfaces) {
591-
if (type instanceof ParameterizedType &&
592-
(Objects.equals(((ParameterizedType) type).getRawType(), RocketMQListener.class) || Objects.equals(((ParameterizedType) type).getRawType(), RocketMQReplyListener.class))) {
593-
matchedGenericInterface = type;
594-
break;
595-
}
596-
}
597-
}
598-
targetClass = targetClass.getSuperclass();
599-
}
600-
if (Objects.isNull(matchedGenericInterface)) {
601-
return Object.class;
602-
}
603-
604-
Type[] actualTypeArguments = ((ParameterizedType) matchedGenericInterface).getActualTypeArguments();
605-
if (Objects.nonNull(actualTypeArguments) && actualTypeArguments.length > 0) {
606-
return actualTypeArguments[0];
607-
}
608-
return Object.class;
583+
ResolvableType resolvableType = ResolvableType.forClass(targetClass).as(consumerInterface);
584+
return resolvableType.getGeneric().getType();
609585
}
610586

587+
611588
private void initRocketMQPushConsumer() throws MQClientException {
612589
if (rocketMQListener == null && rocketMQReplyListener == null) {
613590
throw new IllegalArgumentException("Property 'rocketMQListener' or 'rocketMQReplyListener' is required");

rocketmq-spring-boot/src/test/java/org/apache/rocketmq/spring/support/DefaultRocketMQListenerContainerTest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import static org.assertj.core.api.Assertions.assertThat;
4949
import static org.junit.Assert.assertEquals;
5050
import static org.mockito.ArgumentMatchers.any;
51+
import static org.mockito.ArgumentMatchers.nullable;
5152
import static org.mockito.Mockito.doNothing;
5253
import static org.mockito.Mockito.mock;
5354
import static org.mockito.Mockito.when;
@@ -65,7 +66,7 @@ public void onMessage(String message) {
6566
}
6667
});
6768
Class result = (Class) getMessageType.invoke(listenerContainer);
68-
assertThat(result.getName().equals(String.class.getName()));
69+
assertEquals(result, String.class);
6970

7071
//support message
7172
listenerContainer.setRocketMQListener(new RocketMQListener<Message>() {
@@ -74,16 +75,17 @@ public void onMessage(Message message) {
7475
}
7576
});
7677
result = (Class) getMessageType.invoke(listenerContainer);
77-
assertThat(result.getName().equals(Message.class.getName()));
78+
assertEquals(result, Message.class);
7879

7980
listenerContainer.setRocketMQListener(new RocketMQListener<MessageExt>() {
8081
@Override
8182
public void onMessage(MessageExt message) {
8283
}
8384
});
8485
result = (Class) getMessageType.invoke(listenerContainer);
85-
assertThat(result.getName().equals(MessageExt.class.getName()));
86+
assertEquals(result, MessageExt.class);
8687

88+
listenerContainer.setRocketMQListener(null);
8789

8890
listenerContainer.setRocketMQReplyListener(new RocketMQReplyListener<MessageExt, String>() {
8991
@Override
@@ -92,7 +94,7 @@ public String onMessage(MessageExt message) {
9294
}
9395
});
9496
result = (Class) getMessageType.invoke(listenerContainer);
95-
assertThat(result.getName().equals(MessageExt.class.getName()));
97+
assertEquals(result, MessageExt.class);
9698

9799
listenerContainer.setRocketMQReplyListener(new RocketMQReplyListener<String, String>() {
98100
@Override
@@ -101,7 +103,7 @@ public String onMessage(String message) {
101103
}
102104
});
103105
result = (Class) getMessageType.invoke(listenerContainer);
104-
assertThat(result.getName().equals(String.class.getName()));
106+
assertEquals(result, String.class);
105107
}
106108

107109
@Test

0 commit comments

Comments
 (0)