java游戏服务器架构中,请多多指教——manREDoo
类扫描工具
import org.reflections.Reflections;
/**
* <p>
* 类扫描工具
* </p>
*
* @author : 钟满红
*/
public class ScanClassUtil {
private static final Reflections reflections = new Reflections("top.manred");
public static Reflections getReflections() {
return reflections;
}
}
消息处理器接口
/**
* <p>
* 消息处理器
* </p>
*
* @author : 钟满红
*/
public interface IMessageHandler<T> {
/**
* 消息处理
* @param user 发送消息的用户
* @param message 消息
* @return 处理结果, 后续会被序列化成json字符串
*/
Object handle(User user, T message);
}
消息号
/**
* <p>
* 消息号
* </p>
*
* @author : 钟满红
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MessageCommand {
/**
* 消息号
*/
int cmd();
}
例子:
/**
* <p>
* 测试
* </p>
*
* @author : 钟满红
*/
@MessageCommand(cmd = 1)
public class TestHandler implements IMessageHandler<String>{
@Override
public Object handle(User user, String message) {
return "";
}
}
消息分发服务
/**
* <p>
* 消息分发服务
* </p>
*
* @author : 钟满红
*/
public class MessageFacadeService implements IService {
private Map<Integer, Class<?>> cmdType = new HashMap<>();
private Map<Integer, IMessageHandler<?>> cmdHandler = new HashMap<>();
@Override
public void startup() throws Exception {
Set<Class<? extends IMessageHandler>> clazzSet = ScanClassUtil.getReflections().getSubTypesOf(IMessageHandler.class);
for (Class<? extends IMessageHandler> clazz : clazzSet) {
MessageCommand cm = clazz.getAnnotation(MessageCommand.class);
int cmdId = cm.cmd();
ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericInterfaces()[0];
Type[] typeArguments = parameterizedType.getActualTypeArguments();
Class<?> type = (Class<?>) typeArguments[0];
IMessageHandler handler = (IMessageHandler) clazz.getConstructors()[0].newInstance();
cmdType.put(cmdId, type);
cmdHandler.put(cmdId, handler);
}
}
@Override
public void shutdown() throws Exception {
}
RespMessage dispatch(User user, NetMessage message){
int cmd = message.getCmd();
Class<?> type = cmdType.get(cmd);
IMessageHandler handler = cmdHandler.get(cmd);
Object result = handler.handle(user, JsonUtil.formJson(message.getMessageBody().getData(), type));
RespMessage resp = new RespMessage();
resp.setCmdId(cmd+1);
resp.setData(result);
return resp;
}
}

该博客介绍了Java游戏服务器架构中的一种类扫描工具,用于发现实现了`IMessageHandler`接口的消息处理器。处理器通过`@MessageCommand`注解指定消息号,消息分发服务根据消息号进行处理和调度。在启动时,服务会初始化处理器映射,接收消息后,将消息分发给相应处理器进行处理。
670

被折叠的 条评论
为什么被折叠?



