Skip to content

✨ 正则表达式类型的MessageProcessor处理消息时创建代理类 #52

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 26, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,17 @@ public interface MessageProcessor {
*/
String bindingPipeName();

/**
* The type of current {@link MessageProcessor}
* <p>
* the default type is {@link MessageProcessorType#SPECIFIC}
*
* @return {@link MessageProcessorType}
*/
default MessageProcessorType processorType() {
return MessageProcessorType.SPECIFIC;
}

/**
* Execute processing message
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.minbox.framework.message.pipe.client.process;

import lombok.extern.slf4j.Slf4j;
import org.minbox.framework.message.pipe.client.process.proxy.MessageProcessorProxy;
import org.minbox.framework.message.pipe.core.exception.MessagePipeException;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
Expand All @@ -16,6 +17,11 @@
import java.util.stream.Collectors;

/**
* The {@link MessageProcessor} manager
* <p>
* when the project starts
* it will get the list of MessageProcessor implementation class instances registered in the Spring Ioc container
*
* @author 恒宇少年
*/
@Slf4j
Expand All @@ -38,12 +44,20 @@ public MessageProcessor getMessageProcessor(String pipeName) {
if (ObjectUtils.isEmpty(processor)) {
throw new MessagePipeException("Message pipeline: " + pipeName + ", there is no bound MessageProcessor.");
}
// get message processor proxy instance
if (MessageProcessorType.REGEX == processor.processorType() && !this.processorMap.containsKey(pipeName)) {
MessageProcessor proxyProcessor = MessageProcessorProxy.getProxy(processor.getClass());
this.processorMap.put(pipeName, proxyProcessor);
return proxyProcessor;
}
return processor;
}

/**
* @param pipeName
* @return
* Get the message processor matched by the regular expression according to the pipe name
*
* @param pipeName Specific message pipe name
* @return The {@link MessageProcessor} instance
*/
private MessageProcessor regexGetMessageProcessor(String pipeName) {
Iterator<String> iterator = this.processorMap.keySet().iterator();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.minbox.framework.message.pipe.client.process;

/**
* The {@link MessageProcessor} type define
*
* @author 恒宇少年
*/
public enum MessageProcessorType {
/**
* The specific type
* <p>
* a message processor corresponds to a message pipeline
*/
SPECIFIC,
/**
* The regex type
* <p>
* one processor corresponds to multiple expression pipelines
*/
REGEX
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.minbox.framework.message.pipe.client.process.proxy;

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
* Proxy method interceptor
*
* @author 恒宇少年
*/
public class MessageProcessorMethodInterceptor implements MethodInterceptor {
/**
* handle proxy method
*
* @param o The proxy object instance
* @param method source method
* @param args method args
* @param methodProxy proxy method
* @return proxy method result
* @throws Throwable Exception encountered
*/
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.minbox.framework.message.pipe.client.process.proxy;

import org.minbox.framework.message.pipe.client.process.MessageProcessor;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

/**
* The {@link MessageProcessor} proxy
*
* @author 恒宇少年
*/
public class MessageProcessorProxy {
/**
* Get {@link MessageProcessor} proxy instance
*
* @param clazz Type of proxy
* @return proxy instance
*/
public static MessageProcessor getProxy(Class<?> clazz) {
Enhancer enhancer = new Enhancer();
MethodInterceptor methodInterceptor = new MessageProcessorMethodInterceptor();
enhancer.setClassLoader(clazz.getClassLoader());
enhancer.setSuperclass(clazz);
enhancer.setCallback(methodInterceptor);
return (MessageProcessor) enhancer.create();
}
}