Skip to content

Commit 9fcf269

Browse files
committed
提交部分代码
1 parent 9aacabb commit 9fcf269

File tree

8 files changed

+172
-67
lines changed

8 files changed

+172
-67
lines changed

arex-instrumentation/mq/arex-integration-mqtt/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414

1515
<dependencies>
1616
<dependency>
17-
<groupId>org.springframework.integration</groupId>
18-
<artifactId>spring-integration-mqtt</artifactId>
19-
<version>5.5.10</version>
17+
<groupId>org.springframework</groupId>
18+
<artifactId>spring-messaging</artifactId>
19+
<version>5.3.4</version>
2020
<scope>provided</scope>
2121
</dependency>
2222
</dependencies>

arex-instrumentation/mq/arex-integration-mqtt/src/main/java/io/arex/inst/mqtt/MQTTAdapterHelper.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,32 @@
22

33
import io.arex.agent.bootstrap.model.Mocker;
44
import io.arex.inst.runtime.util.MockUtils;
5+
import org.springframework.messaging.Message;
6+
import org.springframework.messaging.MessageChannel;
57

68
/**
79
* MQTTAdapterHelper
810
*/
911
public class MQTTAdapterHelper {
1012

13+
14+
public static <MC,T extends Message> void onServiceEnter(MessageAdapter<MC,T> adapter, MessageChannel messageChannel,Message<?> message){
15+
if (shouldSkip(messageChannel,message)){
16+
return;
17+
}
18+
19+
20+
}
21+
22+
23+
24+
private static boolean shouldSkip(MessageChannel messageChannel,Message<?> mqttMessage){
25+
if (messageChannel== null || mqttMessage == null) {
26+
return true;
27+
}
28+
return false;
29+
}
30+
1131
public static Mocker createMocker(String operationName) {
1232
Mocker mocker = MockUtils.createMqttConsumer(operationName);
1333
mocker.getTargetRequest().setType(Byte.class.getName());
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.arex.inst.mqtt;
2+
3+
import org.springframework.messaging.Message;
4+
import org.springframework.messaging.MessageHeaders;
5+
6+
/**
7+
* MessageAdapter
8+
*/
9+
public interface MessageAdapter<C,T extends Message> {
10+
11+
byte[] getMsg(C c, T msg);
12+
13+
MessageHeaders getHeader(C c, T msg);
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.arex.inst.mqtt.adapter;
2+
3+
import io.arex.inst.mqtt.MessageAdapter;
4+
import org.springframework.messaging.MessageChannel;
5+
import org.springframework.messaging.MessageHeaders;
6+
import org.springframework.messaging.support.GenericMessage;
7+
8+
import java.nio.charset.StandardCharsets;
9+
10+
/**
11+
* GenericMessageAdapter
12+
*/
13+
public class GenericMessageImpl implements MessageAdapter<MessageChannel, GenericMessage> {
14+
15+
private static final GenericMessageImpl INSTANCE = new GenericMessageImpl();
16+
17+
public static GenericMessageImpl getInstance() {
18+
return INSTANCE;
19+
}
20+
21+
@Override
22+
public byte[] getMsg(MessageChannel messageChannel, GenericMessage msg) {
23+
24+
Object payload = msg.getPayload();
25+
26+
if (payload instanceof byte[]){
27+
return ((byte[]) payload);
28+
}
29+
return payload.toString().getBytes(StandardCharsets.UTF_8);
30+
}
31+
32+
@Override
33+
public MessageHeaders getHeader(MessageChannel messageChannel, GenericMessage msg) {
34+
return msg.getHeaders();
35+
}
36+
}

arex-instrumentation/mq/arex-integration-mqtt/src/main/java/io/arex/inst/mqtt/inst/EclipseInstrumentationV3.java

Lines changed: 0 additions & 63 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package io.arex.inst.mqtt.inst;
2+
3+
import io.arex.agent.bootstrap.model.Mocker;
4+
import io.arex.agent.bootstrap.util.StringUtil;
5+
import io.arex.inst.extension.MethodInstrumentation;
6+
import io.arex.inst.extension.TypeInstrumentation;
7+
import io.arex.inst.mqtt.MQTTAdapterHelper;
8+
import io.arex.inst.mqtt.adapter.GenericMessageImpl;
9+
import io.arex.inst.runtime.context.ContextManager;
10+
import io.arex.inst.runtime.listener.CaseEvent;
11+
import io.arex.inst.runtime.listener.CaseEventDispatcher;
12+
import io.arex.inst.runtime.util.MockUtils;
13+
import net.bytebuddy.asm.Advice;
14+
import net.bytebuddy.description.method.MethodDescription;
15+
import net.bytebuddy.description.type.TypeDescription;
16+
import net.bytebuddy.matcher.ElementMatcher;
17+
import org.springframework.messaging.Message;
18+
import org.springframework.messaging.MessageChannel;
19+
20+
import java.util.Base64;
21+
import java.util.Collections;
22+
import java.util.List;
23+
24+
import static io.arex.inst.extension.matcher.SafeExtendsClassMatcher.extendsClass;
25+
import static net.bytebuddy.matcher.ElementMatchers.named;
26+
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
27+
28+
/**
29+
* EclipseInstrumentationV3
30+
*/
31+
public class MQGenericInstrumentationV3 extends TypeInstrumentation {
32+
@Override
33+
protected ElementMatcher<TypeDescription> typeMatcher() {
34+
return extendsClass(named("org.springframework.messaging.core.AbstractMessageSendingTemplate"), false)
35+
.and(named("org.springframework.messaging.core.GenericMessagingTemplate"));
36+
}
37+
38+
@Override
39+
public List<MethodInstrumentation> methodAdvices() {
40+
ElementMatcher<MethodDescription> matcher = named("doSend")
41+
.and(takesArgument(0, named("org.springframework.messaging.MessageChannel")))
42+
.and(takesArgument(1, named("org.springframework.messaging.Message")));
43+
return Collections.singletonList(new MethodInstrumentation(matcher, ArrivedAdvice.class.getName()));
44+
}
45+
46+
public static class ArrivedAdvice {
47+
48+
@Advice.OnMethodEnter(suppress = Throwable.class)
49+
public static void onEnter(@Advice.Argument(value = 0, readOnly = false) MessageChannel messageChannel,
50+
@Advice.Argument(value = 1, readOnly = false) Message<?> message) {
51+
52+
MQTTAdapterHelper.onServiceEnter(GenericMessageImpl.getInstance(),messageChannel,message);
53+
54+
55+
if (shouldSkip(messageChannel,message)){
56+
return;
57+
}
58+
CaseEventDispatcher.onEvent(CaseEvent.ofEnterEvent());
59+
// if (ContextManager.needRecordOrReplay()){
60+
// Mocker mocker = MQTTAdapterHelper.createMocker(topic);
61+
// mocker.getTargetRequest().setBody(Base64.getEncoder().encodeToString(mqttMessage.getPayload()));
62+
// if (ContextManager.needReplay()) {
63+
// MockUtils.replayMocker(mocker);
64+
// } else if (ContextManager.needRecord()) {
65+
// MockUtils.recordMocker(mocker);
66+
// }
67+
// }
68+
}
69+
70+
}
71+
72+
}

arex-instrumentation/mq/arex-integration-mqtt/src/main/java/io/arex/inst/mqtt/inst/MQTTAdapterModuleInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ public MQTTAdapterModuleInstrumentation() {
1919

2020
@Override
2121
public List<TypeInstrumentation> instrumentationTypes() {
22-
return Arrays.asList(new EclipseInstrumentationV3());
22+
return Arrays.asList(new MQGenericInstrumentationV3());
2323
}
2424
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.arex.inst.mqtt.inst;
2+
3+
4+
import net.bytebuddy.description.type.TypeDescription;
5+
import org.junit.jupiter.api.Test;
6+
import org.springframework.messaging.core.AbstractMessageSendingTemplate;
7+
import org.springframework.messaging.core.GenericMessagingTemplate;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
import static org.junit.jupiter.api.Assertions.assertFalse;
11+
import static org.junit.jupiter.api.Assertions.assertTrue;
12+
13+
public class EclipseInstrumentationV3Test {
14+
MQGenericInstrumentationV3 inst = new MQGenericInstrumentationV3();
15+
16+
@Test
17+
void typeMatcher() {
18+
assertFalse(inst.typeMatcher().matches(TypeDescription.ForLoadedType.of(AbstractMessageSendingTemplate.class)));
19+
assertTrue(inst.typeMatcher().matches(TypeDescription.ForLoadedType.of(GenericMessagingTemplate.class)));
20+
}
21+
22+
@Test
23+
void methodAdvices() {
24+
assertEquals(1, inst.methodAdvices().size());
25+
}
26+
}

0 commit comments

Comments
 (0)