44 changed files with 1499 additions and 320 deletions
@ -0,0 +1,29 @@ |
|||
package com.ccsens.tall.rabbitMQ; |
|||
|
|||
|
|||
import com.ccsens.util.config.RabbitMQConfig; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
import org.springframework.amqp.rabbit.annotation.RabbitHandler; |
|||
import org.springframework.amqp.rabbit.annotation.RabbitListener; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
|
|||
@Component |
|||
@RabbitListener(queues = RabbitMQConfig.TALL_MESSAGE_2) |
|||
public class RabbitController { |
|||
private Logger logger = LoggerFactory.getLogger(RabbitController.class); |
|||
|
|||
@RabbitHandler |
|||
public void process(String messageJson) { |
|||
logger.info("Rabbit Received: {}",messageJson); |
|||
try { |
|||
System.out.println("Rabbit Received: " + messageJson); |
|||
|
|||
}catch (Exception e){ |
|||
e.printStackTrace(); |
|||
} |
|||
|
|||
} |
|||
|
|||
} |
@ -1,4 +0,0 @@ |
|||
package com.ccsens.util.bean; |
|||
|
|||
public class BaseVo { |
|||
} |
@ -0,0 +1,31 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class AckMessage extends ServerMessage { |
|||
@Setter |
|||
@Getter |
|||
public static class Data { |
|||
String ackId; |
|||
} |
|||
|
|||
private Data data; |
|||
|
|||
public AckMessage(){ |
|||
setType(MessageConstant.ClientMessageType.Ack.name()); |
|||
} |
|||
|
|||
public AckMessage(String ackId){ |
|||
this(); |
|||
data = new Data(); |
|||
data.setAckId(ackId); |
|||
} |
|||
} |
@ -0,0 +1,37 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author wei |
|||
* 客户端认证 (user) |
|||
*/ |
|||
@Data |
|||
public class AuthMessage extends ServerMessage { |
|||
@Setter |
|||
@Getter |
|||
public static class Data{ |
|||
private String token; |
|||
private int major; |
|||
private int minor; |
|||
} |
|||
|
|||
private Data data; |
|||
|
|||
public AuthMessage(){ |
|||
setType(MessageConstant.ClientMessageType.Auth.name()); |
|||
} |
|||
|
|||
public AuthMessage(String token,int major,int minor){ |
|||
this(); |
|||
data = new Data(); |
|||
data.setToken(token); |
|||
data.setMajor(major); |
|||
data.setMinor(minor); |
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* @author wei |
|||
* 客户端向服务器请求当前连接状态 |
|||
*/ |
|||
@Data |
|||
public class ClientAuthTimeOutMessage extends ServerMessage { |
|||
public ClientAuthTimeOutMessage(){ |
|||
setType(MessageConstant.ClientMessageType.ClientAuthTimeOut.name()); |
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* @author wei |
|||
* 客户端向服务器请求当前连接状态 |
|||
*/ |
|||
@Data |
|||
public class ClientIdleClosedMessage extends ServerMessage { |
|||
public ClientIdleClosedMessage(){ |
|||
setType(MessageConstant.ClientMessageType.ClientIdleClosed.name()); |
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* @author wei |
|||
* 客户端向服务器请求当前连接状态 |
|||
*/ |
|||
@Data |
|||
public class GetStatusMessage extends ServerMessage { |
|||
public GetStatusMessage(){ |
|||
setType(MessageConstant.ClientMessageType.GetChannelStatus.name()); |
|||
} |
|||
} |
@ -0,0 +1,37 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class HasReadMessage extends ServerMessage { |
|||
/** |
|||
* fromDomain域的fromUserId用户 给我发送的所有 时间<lastMsgId时间的消息 都已读。 |
|||
*/ |
|||
@Setter |
|||
@Getter |
|||
public static class Data { |
|||
private Long time; |
|||
private String fromUserId; |
|||
private String fromDomain; |
|||
} |
|||
|
|||
private Data data; |
|||
|
|||
public HasReadMessage(){ |
|||
setType(MessageConstant.ClientMessageType.HasRead.name()); |
|||
} |
|||
|
|||
public HasReadMessage(Long time){ |
|||
this(); |
|||
data = new Data(); |
|||
data.setTime(time); |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class PingMessage extends ServerMessage { |
|||
@Setter |
|||
@Getter |
|||
public static class Data{ |
|||
private Integer major; |
|||
private Integer minor; |
|||
} |
|||
private Data data; |
|||
|
|||
public PingMessage(){ |
|||
setType(MessageConstant.ClientMessageType.Ping.name()); |
|||
} |
|||
|
|||
public PingMessage(Integer major,Integer minor){ |
|||
this(); |
|||
data = new Data(); |
|||
data.setMajor(major); |
|||
data.setMinor(minor); |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class SetDeletedStatusMessage extends ServerMessage { |
|||
@Setter |
|||
@Getter |
|||
public static class Data { |
|||
String msgId; |
|||
} |
|||
|
|||
private Data data; |
|||
|
|||
public SetDeletedStatusMessage(){ |
|||
setType(MessageConstant.ClientMessageType.SetMsgDeleted.name()); |
|||
} |
|||
|
|||
public SetDeletedStatusMessage(String msgId){ |
|||
this(); |
|||
data = new Data(); |
|||
data.setMsgId(msgId); |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class SetRevertedStatusMessage extends ServerMessage { |
|||
@Setter |
|||
@Getter |
|||
public static class Data { |
|||
String msgId; |
|||
} |
|||
|
|||
private Data data; |
|||
|
|||
public SetRevertedStatusMessage(){ |
|||
setType(MessageConstant.ClientMessageType.SetMsgReverted.name()); |
|||
} |
|||
|
|||
public SetRevertedStatusMessage(String msgId){ |
|||
this(); |
|||
data = new Data(); |
|||
data.setMsgId(msgId); |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class SetSuccessStatusMessage extends ServerMessage { |
|||
@Setter |
|||
@Getter |
|||
public static class Data { |
|||
String msgId; |
|||
} |
|||
|
|||
private Data data; |
|||
|
|||
public SetSuccessStatusMessage(){ |
|||
setType(MessageConstant.ClientMessageType.SetMsgSuccess.name()); |
|||
} |
|||
|
|||
public SetSuccessStatusMessage(String msgId){ |
|||
this(); |
|||
data = new Data(); |
|||
data.setMsgId(msgId); |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
package com.ccsens.util.bean.message.client; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author wei |
|||
* 客户端向服务器请求当前连接状态 |
|||
*/ |
|||
@Data |
|||
public class UnExceptedErrorMessage extends ServerMessage { |
|||
@Getter@Setter |
|||
public static class Data{ |
|||
private String errorString; |
|||
} |
|||
|
|||
private Data data; |
|||
|
|||
public UnExceptedErrorMessage(){ |
|||
setType(MessageConstant.ClientMessageType.UnExceptedError.name()); |
|||
} |
|||
|
|||
public UnExceptedErrorMessage(String errorString){ |
|||
this(); |
|||
data = new Data(); |
|||
data.setErrorString(errorString); |
|||
} |
|||
} |
@ -0,0 +1,95 @@ |
|||
package com.ccsens.util.bean.message.common; |
|||
|
|||
import cn.hutool.core.date.DateUtil; |
|||
import com.ccsens.util.JacksonUtil; |
|||
import com.fasterxml.jackson.annotation.JsonProperty; |
|||
import com.fasterxml.jackson.core.JsonProcessingException; |
|||
import lombok.Data; |
|||
|
|||
import java.util.Set; |
|||
|
|||
/** |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class InMessage { |
|||
/** |
|||
* 消息ID |
|||
*/ |
|||
@JsonProperty(access = JsonProperty.Access.READ_ONLY) |
|||
private String id; |
|||
/** |
|||
* 发送时间(s) |
|||
* Notice: 指的是服务器收到发送请求的时间,不是服务器发出消息的时间 |
|||
*/ |
|||
@JsonProperty(access = JsonProperty.Access.READ_ONLY) |
|||
private Long time; |
|||
/** |
|||
* 消息来自于那个域 |
|||
*/ |
|||
@JsonProperty(access = JsonProperty.Access.READ_ONLY) |
|||
private MessageConstant.DomainType fromDomain; |
|||
/** |
|||
* 发送者信息 |
|||
*/ |
|||
private String from; |
|||
/** |
|||
* 消息要发送到哪个域 |
|||
*/ |
|||
private MessageConstant.DomainType toDomain; |
|||
/** |
|||
* 接受者信息(列表) |
|||
*/ |
|||
private Set<String> tos; |
|||
/** |
|||
* 消息的标示符(通常是由用户传过来的消息ID,该消息在用户系统中的ID) |
|||
*/ |
|||
private String unikey; |
|||
/** |
|||
* 发送规则 |
|||
* DeSerialize but not serialize @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) |
|||
*/ |
|||
private MessageRule rule; |
|||
/** |
|||
* 发送内容 |
|||
* 如果toDomain是Server: 代表消息是发给当前服务器的,必须是MessageSysData的子类型 |
|||
* 其他:(格式不限,由用户指定) |
|||
*/ |
|||
private String data; |
|||
|
|||
public InMessage(){ |
|||
this.time = DateUtil.currentSeconds(); |
|||
} |
|||
public static InMessage newToServerMessage(MessageConstant.DomainType fromDomain,ServerMessage serverMessage) throws JsonProcessingException { |
|||
InMessage inMessage = new InMessage(); |
|||
inMessage.setFromDomain(fromDomain); |
|||
inMessage.setToDomain(MessageConstant.DomainType.Server); |
|||
inMessage.setData(JacksonUtil.beanToJson(serverMessage)); |
|||
return inMessage; |
|||
} |
|||
|
|||
public static InMessage newToQueueMessage(String from, Set<String> tos, String unikey, MessageRule rule, String data) throws JsonProcessingException { |
|||
InMessage inMessage = new InMessage(); |
|||
inMessage.setToDomain(MessageConstant.DomainType.Queue); |
|||
inMessage.setFrom(from); |
|||
inMessage.setTos(tos); |
|||
inMessage.setUnikey(unikey); |
|||
inMessage.setRule(rule); |
|||
inMessage.setData(data); |
|||
return inMessage; |
|||
} |
|||
public static InMessage newToUserMessage(String from, Set<String> tos, String unikey, MessageRule rule, String data) throws JsonProcessingException { |
|||
InMessage inMessage = new InMessage(); |
|||
inMessage.setToDomain(MessageConstant.DomainType.User); |
|||
inMessage.setFrom(from); |
|||
inMessage.setTos(tos); |
|||
inMessage.setUnikey(unikey); |
|||
inMessage.setRule(rule); |
|||
inMessage.setData(data); |
|||
return inMessage; |
|||
} |
|||
|
|||
|
|||
//TODO
|
|||
//添加方便链式调用的构造方法,类似builder
|
|||
} |
@ -0,0 +1,134 @@ |
|||
package com.ccsens.util.bean.message.common; |
|||
|
|||
import cn.hutool.core.date.DateUtil; |
|||
import lombok.Data; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class Message { |
|||
/** |
|||
* 消息ID (Message's ID) |
|||
*/ |
|||
private String id; |
|||
|
|||
/** |
|||
* 原始消息ID (InMessage's ID) |
|||
*/ |
|||
private String rawId; |
|||
|
|||
/** |
|||
* 发送时间(s) |
|||
* Notice: 指的是服务器收到发送请求的时间,不是服务器发出消息的时间 |
|||
*/ |
|||
private Long time; |
|||
/** |
|||
* 消息来自于那个域 |
|||
*/ |
|||
private MessageConstant.DomainType fromDomain; |
|||
/** |
|||
* 发送者信息 |
|||
*/ |
|||
private String from; |
|||
/** |
|||
* 消息要发送到哪个域 |
|||
*/ |
|||
private MessageConstant.DomainType toDomain; |
|||
/** |
|||
* 接受者信息(列表) |
|||
*/ |
|||
private String to; |
|||
/** |
|||
* 发送规则 |
|||
* DeSerialize but not serialize @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) |
|||
*/ |
|||
private MessageRule rule; |
|||
/** |
|||
* 发送内容 |
|||
* 如果toDomain是Server: 代表消息是发给当前服务器的,必须是MessageSysData的子类型 |
|||
* 其他:(格式不限,由用户指定) |
|||
*/ |
|||
private String data; |
|||
|
|||
/** |
|||
* 是否收到用户的ack消息 |
|||
*/ |
|||
private byte acked; |
|||
/** |
|||
* 是否收到用户的已读消息 |
|||
*/ |
|||
private byte hasRead; |
|||
/** |
|||
* 消息状态 |
|||
* 发送成功标志:根据配置由三种情况 |
|||
* 1. 配置不需要客户端ack, |
|||
* 发送完毕自动设置 ack = true; |
|||
* rule -> ackIsSuccess = true 发送即代表成功 |
|||
* rule -> ackIsSuccess = false 等待用户手动设置成功标志 |
|||
* 2. 配置需要ack,则发送并受到ack代表成功 |
|||
* rule -> ackIsSuccess = true 发送并收到ack即代表成功 |
|||
* rule -> ackIsSuccess = false 等待用户手动设置成功标志 |
|||
*/ |
|||
private MessageConstant.Status status; |
|||
|
|||
/** |
|||
* 发送次数 |
|||
*/ |
|||
private int sendTimes; |
|||
/** |
|||
* 发送时间 |
|||
*/ |
|||
private List<Long> sendTimeInSecondList; |
|||
|
|||
public Message(){ |
|||
} |
|||
|
|||
public Message(MessageConstant.DomainType fromDomain,String from,MessageConstant.DomainType toDomain,String to,String data,MessageRule rule){ |
|||
this.time = DateUtil.currentSeconds(); |
|||
this.fromDomain = fromDomain; |
|||
this.from = from; |
|||
this.toDomain = toDomain; |
|||
this.to = to; |
|||
this.data = data; |
|||
this.rule = rule; |
|||
} |
|||
|
|||
public Message(InMessage inEntity, String to){ |
|||
this.rawId = inEntity.getId(); |
|||
this.time = inEntity.getTime(); |
|||
this.fromDomain = inEntity.getFromDomain(); |
|||
this.from = inEntity.getFrom(); |
|||
this.toDomain = inEntity.getToDomain(); |
|||
this.to = to; |
|||
this.rule = inEntity.getRule(); |
|||
this.data = inEntity.getData(); |
|||
|
|||
this.acked = 0; |
|||
this.hasRead = 0; |
|||
this.status = MessageConstant.Status.Pending; |
|||
this.sendTimes = 0; |
|||
} |
|||
|
|||
public void incrementSendTimes() { |
|||
this.sendTimes++; |
|||
if(this.sendTimeInSecondList == null){ |
|||
this.sendTimeInSecondList = new ArrayList<>(); |
|||
} |
|||
this.sendTimeInSecondList.add(DateUtil.currentSeconds()); |
|||
} |
|||
|
|||
public boolean isSendTimesUpLimit() { |
|||
if((rule.getNoAckRetryTimes() > 0) && (sendTimes >= rule.getNoAckRetryTimes())){ |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
public boolean isExpired() { |
|||
return DateUtil.currentSeconds() >= rule.getExpireAt(); |
|||
} |
|||
} |
@ -0,0 +1,217 @@ |
|||
package com.ccsens.util.bean.message.common; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonFormat; |
|||
|
|||
/** |
|||
* @author wei |
|||
* 消息相关常量 |
|||
*/ |
|||
public class MessageConstant { |
|||
public enum ClientMessageType{ |
|||
//客户端心跳
|
|||
Ping(0x00), |
|||
//客户端认证
|
|||
Auth(0x01), |
|||
//客户端收到消息ACK
|
|||
Ack(0x02), |
|||
//客户端收到消息ACK
|
|||
HasRead(0x03), |
|||
//客户端请求连接状态
|
|||
GetChannelStatus(0x04), |
|||
|
|||
//不可预期的错误
|
|||
UnExceptedError(0x21), |
|||
ClientIdleClosed(0x22), |
|||
ClientAuthTimeOut(0x23), |
|||
|
|||
//设置消息状态消息(disable撤销消息,适用于,消息撤回),针对消息本身(eg:消息撤回)
|
|||
SetMsgSuccess(0x52), |
|||
SetMsgReverted(0x53), |
|||
SetMsgDeleted(0x54); |
|||
|
|||
public int value; |
|||
|
|||
ClientMessageType(int value){ |
|||
this.value = value; |
|||
} |
|||
|
|||
/** |
|||
* 从int到enum的转换函数 |
|||
* @param value 枚举int值 |
|||
* @return 对应的枚举,找不到则返回null |
|||
*/ |
|||
public static ClientMessageType valueOf(int value) { |
|||
for(ClientMessageType type : values()){ |
|||
if(type.value == value){ |
|||
return type; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
} |
|||
|
|||
public enum ServerMessageType{ |
|||
//客户端心跳
|
|||
Pong(0x00), |
|||
//客户端收到消息ACK
|
|||
Ack(0x02), |
|||
//客户端请求连接状态
|
|||
ChannelStatus(0x03); |
|||
//撤销某个消息
|
|||
//DelMessage(0x04),
|
|||
//客户端请求连接状态
|
|||
//QueueStatus(0x05);
|
|||
|
|||
public int value; |
|||
|
|||
ServerMessageType(int value){ |
|||
this.value = value; |
|||
} |
|||
|
|||
/** |
|||
* 从int到enum的转换函数 |
|||
* @param value 枚举int值 |
|||
* @return 对应的枚举,找不到则返回null |
|||
*/ |
|||
public static ServerMessageType valueOf(int value) { |
|||
for(ServerMessageType type : values()){ |
|||
if(type.value == value){ |
|||
return type; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* JsonFormat是Json Serialize相关配置 |
|||
*/ |
|||
@JsonFormat(shape = JsonFormat.Shape.OBJECT) |
|||
public enum Error{ |
|||
//Ok
|
|||
Ok(200,"Ok"), |
|||
|
|||
/** |
|||
* 通用消息错误 |
|||
*/ |
|||
//消息无接收者错误
|
|||
MessageNoReceiversError(1001,"[用户]消息至少应该有一个接收者"), |
|||
//消息无数据错误
|
|||
MessageNoDataError(1002,"不允许消息内容为空"), |
|||
|
|||
/** |
|||
* server消息错误 |
|||
*/ |
|||
//server消息无type错误
|
|||
MessageNoTypeError(1003,"发送至Server域的消息必须有type字段"), |
|||
//Ack参数错误,没有找到对应的msgId
|
|||
AckParameterError(1103,"Ack参数错误,没有找到对应的msgId"), |
|||
//SetSuccess参数错误,没有找到对应的msgId
|
|||
SetSuccessParameterError(1104,"SetSuccess参数错误,没有找到对应的msgId"), |
|||
//SetStatusParameterError
|
|||
SetStatusParameterError(1105,"SetStatus参数错误,没有找到对应的msgId"), |
|||
//HasRead参数错误,没有找到对应的msgId
|
|||
HasReadParameterError(1106,"HasRead参数错误,没有找到对应的msgId"), |
|||
|
|||
/** |
|||
* 身份认证错误 |
|||
*/ |
|||
//无权限
|
|||
UnAuthed(1021, "未认证的用户"), |
|||
|
|||
/** |
|||
* 业务错误 |
|||
*/ |
|||
//认证失败
|
|||
AuthFailed(1301,"认证失败"), |
|||
//空闲断开连接(连续Ns没有收到数据)
|
|||
ChannelIdle(1302,"连接断开:连续N秒没有从收到客户端收到任何数据"), |
|||
//认证超时断开连接
|
|||
ChannelAuthTimeOut(1303,"连接断开:认证超时"), |
|||
//不可预期错误
|
|||
UnExpectedError(1304,"不可预期异常"); |
|||
|
|||
public int code; |
|||
public String text; |
|||
public String extra; |
|||
|
|||
Error(int code,String text) { |
|||
this.code = code; |
|||
this.text = text; |
|||
} |
|||
Error(int code,String text,String extra) { |
|||
this.code = code; |
|||
this.text = text; |
|||
this.extra = extra; |
|||
} |
|||
public Error joinExtra(String extra){ |
|||
this.extra = extra; |
|||
return this; |
|||
} |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 域(User、Queue、Rest、Server) |
|||
*/ |
|||
public enum DomainType{ |
|||
//Netty Client
|
|||
User(1), |
|||
//Queue Client
|
|||
Queue(2), |
|||
//Rest Client
|
|||
Rest(3), |
|||
//系统
|
|||
Server(4); |
|||
|
|||
public int value; |
|||
|
|||
DomainType(int value){ |
|||
this.value = value; |
|||
} |
|||
|
|||
public static DomainType valueOf(int value) { |
|||
for(DomainType domainType : values()){ |
|||
if(domainType.value == value){ |
|||
return domainType; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
} |
|||
|
|||
public enum Status{ |
|||
//未决状态(未完成)
|
|||
Pending(0), |
|||
//发送成功(投递成功)
|
|||
Succeed(1), |
|||
//发送失败(投递失败)
|
|||
Failed(2), |
|||
//消息过期
|
|||
Expired(3), |
|||
//消息被撤回
|
|||
Reverted(4), |
|||
//消息被删除
|
|||
Deleted(5), |
|||
//消息达到重试次数上限
|
|||
SendTimesUpLimit(6), |
|||
|
|||
//临时完成状态,当ackIsSuccess==0时,一旦ack设置消息为此状态
|
|||
TempSucceed(10); |
|||
|
|||
public int value; |
|||
|
|||
Status(int value){ |
|||
this.value = value; |
|||
} |
|||
|
|||
public static Status valueOf(int value){ |
|||
for(Status status : values()){ |
|||
if(status.value == value){ |
|||
return status; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,80 @@ |
|||
package com.ccsens.util.bean.message.common; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* 发送规则实体类 |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class MessageRule { |
|||
public enum AckRule{ |
|||
//不需要ack
|
|||
NONE, |
|||
//产生错误时回复ack
|
|||
ERROR, |
|||
//总是回复ack
|
|||
ALWAYS |
|||
} |
|||
/** |
|||
* 离线丢弃标志 |
|||
*/ |
|||
private byte offlineDiscard; |
|||
/** |
|||
* 消息是否需要ack,如果不需要ack,则发送完毕,即代表成功 |
|||
*/ |
|||
private AckRule ackRule; |
|||
/** |
|||
* 没有收到ack重试次数 |
|||
*/ |
|||
private Integer noAckRetryTimes; |
|||
/** |
|||
* 收到ack代表发送成功,不再发送 |
|||
* 如果该标志为0,则代表每次上线都发送,直到用户手动设置成功。 |
|||
*/ |
|||
private byte ackIsSuccess; |
|||
/** |
|||
* 消息过期时间(s) |
|||
*/ |
|||
private Long expireAt; |
|||
|
|||
public MessageRule(){ |
|||
|
|||
} |
|||
|
|||
public MessageRule(byte offlineDiscard,AckRule ackRule,Integer noAckRetryTimes,byte ackIsSuccess){ |
|||
this.offlineDiscard = offlineDiscard; |
|||
this.ackRule = ackRule; |
|||
this.noAckRetryTimes = noAckRetryTimes; |
|||
this.ackIsSuccess = ackIsSuccess; |
|||
} |
|||
|
|||
public MessageRule(byte offlineDiscard,AckRule ackRule,Integer noAckRetryTimes,byte ackIsSuccess,Long expireAt){ |
|||
this.offlineDiscard = offlineDiscard; |
|||
this.ackRule = ackRule; |
|||
this.noAckRetryTimes = noAckRetryTimes; |
|||
this.ackIsSuccess = ackIsSuccess; |
|||
this.expireAt = expireAt; |
|||
} |
|||
|
|||
public static MessageRule defaultRule(MessageConstant.DomainType fromDomain) { |
|||
MessageRule messageRule = null; |
|||
switch(fromDomain) { |
|||
case User: |
|||
messageRule = new MessageRule((byte) 0, AckRule.ALWAYS, 10, (byte) 1,0L); |
|||
break; |
|||
case Queue: |
|||
messageRule = new MessageRule((byte) 1, AckRule.ALWAYS, 10, (byte) 1,0L); |
|||
break; |
|||
case Rest: |
|||
messageRule = new MessageRule((byte) 1, AckRule.ALWAYS, 10, (byte) 1,0L); |
|||
break; |
|||
case Server: |
|||
messageRule = new MessageRule((byte) 1, AckRule.ALWAYS, 10, (byte) 1,0L); |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
return messageRule; |
|||
} |
|||
} |
@ -0,0 +1,71 @@ |
|||
package com.ccsens.util.bean.message.common; |
|||
|
|||
import cn.hutool.core.date.DateUtil; |
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class OutMessage { |
|||
/** |
|||
* 消息ID |
|||
*/ |
|||
private String id; |
|||
/** |
|||
* sender发送消息时间(s) |
|||
* Notice: 指的是服务器收到发送请求的时间,不是服务器发出消息的时间,服务器发出消息的时间客户端很好确定(就是当前时间) |
|||
*/ |
|||
private Long time; |
|||
/** |
|||
* 消息来自于那个域,通常不需要知道toDomain |
|||
*/ |
|||
private MessageConstant.DomainType fromDomain; |
|||
/** |
|||
* 发送者信息 |
|||
*/ |
|||
private String from; |
|||
/** |
|||
* 如果toDomain是Server: 代表消息是发给当前服务器的,必须是MessageSysData的子类型 |
|||
* 其他:(格式不限,由用户指定,消息系统会将data字段原封不动投递到接收方,由接收方进行解析) |
|||
*/ |
|||
private String data; |
|||
|
|||
public OutMessage(){ |
|||
} |
|||
|
|||
public OutMessage(String id, Long time, String from, String data){ |
|||
this.id = id; |
|||
this.time = time; |
|||
this.from = from; |
|||
this.data = data; |
|||
} |
|||
|
|||
public OutMessage(InMessage messageEntity){ |
|||
this.id = messageEntity.getId(); |
|||
this.time = messageEntity.getTime(); |
|||
this.fromDomain = messageEntity.getFromDomain(); |
|||
this.from = messageEntity.getFrom(); |
|||
this.data = messageEntity.getData(); |
|||
} |
|||
|
|||
public OutMessage(String data){ |
|||
this.time = DateUtil.currentSeconds(); |
|||
this.fromDomain = MessageConstant.DomainType.Server; |
|||
this.data = data; |
|||
} |
|||
|
|||
public OutMessage(MessageConstant.DomainType fromDomain, String data) { |
|||
this.time = DateUtil.currentSeconds(); |
|||
this.fromDomain = fromDomain; |
|||
this.data = data; |
|||
} |
|||
|
|||
public OutMessage(Message message){ |
|||
this.id = message.getId(); |
|||
this.time = message.getTime(); |
|||
this.fromDomain = message.getFromDomain(); |
|||
this.from = message.getFrom(); |
|||
this.data = message.getData(); |
|||
} |
|||
} |
@ -0,0 +1,43 @@ |
|||
package com.ccsens.util.bean.message.common; |
|||
|
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
import lombok.ToString; |
|||
|
|||
import java.util.Collection; |
|||
import java.util.HashSet; |
|||
import java.util.Set; |
|||
|
|||
/** |
|||
* @author __zHangSan |
|||
*/ |
|||
@Getter @Setter @ToString |
|||
public class OutMessageSet { |
|||
private String ackId; |
|||
private Set<OutMessage> messageSet; |
|||
|
|||
public OutMessageSet ackId(String ackId){ |
|||
this.ackId = ackId; |
|||
return this; |
|||
} |
|||
|
|||
public static OutMessageSet newInstance(){ |
|||
return new OutMessageSet(); |
|||
} |
|||
|
|||
public OutMessageSet add(OutMessage messageOutEntity){ |
|||
if(messageSet == null){ |
|||
messageSet = new HashSet<>(); |
|||
} |
|||
messageSet.add(messageOutEntity); |
|||
return this; |
|||
} |
|||
|
|||
public OutMessageSet addAll(Collection<OutMessage> theMessageSet){ |
|||
if(messageSet == null){ |
|||
messageSet = new HashSet<>(); |
|||
} |
|||
messageSet.addAll(theMessageSet); |
|||
return this; |
|||
} |
|||
} |
@ -0,0 +1,11 @@ |
|||
package com.ccsens.util.bean.message.common; |
|||
|
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* @author wei |
|||
*/ |
|||
@Data |
|||
public class ServerMessage { |
|||
private String type; |
|||
} |
@ -0,0 +1,37 @@ |
|||
package com.ccsens.util.bean.message.server; |
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author zhangsan |
|||
*/ |
|||
@Data |
|||
public class ChannelStatusMessage extends ServerMessage { |
|||
@Setter |
|||
@Getter |
|||
public static class Data{ |
|||
//认证状态
|
|||
private Boolean authed; |
|||
//已认证时长(s)
|
|||
private Long onlineSeconds; |
|||
//错误信息
|
|||
private MessageConstant.Error error; |
|||
} |
|||
private Data data; |
|||
|
|||
public ChannelStatusMessage(){ |
|||
setType(MessageConstant.ServerMessageType.ChannelStatus.name()); |
|||
} |
|||
|
|||
public ChannelStatusMessage(Boolean authed,Long onlineSeconds,MessageConstant.Error error){ |
|||
this(); |
|||
data = new Data(); |
|||
data.authed = authed; |
|||
data.onlineSeconds = onlineSeconds; |
|||
data.error = error; |
|||
} |
|||
} |
@ -0,0 +1,29 @@ |
|||
package com.ccsens.util.bean.message.server; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author __zHangSan |
|||
*/ |
|||
public class InvertedMessage extends ServerMessage { |
|||
@Setter |
|||
@Getter |
|||
public static class Data{ |
|||
private String msgId; |
|||
} |
|||
private Data data; |
|||
|
|||
public InvertedMessage(){ |
|||
setType(MessageConstant.ServerMessageType.Pong.name()); |
|||
} |
|||
|
|||
public InvertedMessage(String msgId){ |
|||
this(); |
|||
data = new Data(); |
|||
data.setMsgId(msgId); |
|||
} |
|||
} |
@ -0,0 +1,15 @@ |
|||
package com.ccsens.util.bean.message.server; |
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* @author zhangsan |
|||
*/ |
|||
@Data |
|||
public class PongMessage extends ServerMessage { |
|||
public PongMessage(){ |
|||
setType(MessageConstant.ServerMessageType.Pong.name()); |
|||
} |
|||
} |
@ -0,0 +1,31 @@ |
|||
package com.ccsens.util.bean.message.server; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
import lombok.Getter; |
|||
import lombok.Setter; |
|||
|
|||
/** |
|||
* @author zhangsan |
|||
*/ |
|||
@Data |
|||
public class QueueStatusMessage extends ServerMessage { |
|||
@Setter |
|||
@Getter |
|||
public static class Data{ |
|||
private MessageConstant.Error error; |
|||
} |
|||
private Data data; |
|||
|
|||
public QueueStatusMessage(){ |
|||
setType(MessageConstant.ServerMessageType.ChannelStatus.name()); |
|||
} |
|||
|
|||
public QueueStatusMessage(MessageConstant.Error error){ |
|||
this(); |
|||
data = new Data(); |
|||
data.error = error; |
|||
} |
|||
} |
@ -0,0 +1,50 @@ |
|||
package com.ccsens.util.bean.message.server; |
|||
|
|||
|
|||
import com.ccsens.util.bean.message.common.MessageConstant; |
|||
import com.ccsens.util.bean.message.common.ServerMessage; |
|||
import lombok.Data; |
|||
|
|||
/** |
|||
* @author zhangsan |
|||
*/ |
|||
@Data |
|||
public class ServerAckMessage extends ServerMessage { |
|||
@lombok.Data |
|||
public static class Data{ |
|||
/** |
|||
* 消息ID |
|||
*/ |
|||
private String msgId; |
|||
/** |
|||
* 发送者指定的unikey,如果发送者未指定,则为null |
|||
*/ |
|||
private String unikey; |
|||
/** |
|||
* 消息状态 |
|||
*/ |
|||
private MessageConstant.Error error; |
|||
|
|||
public Data(String msgId,String unikey,MessageConstant.Error error){ |
|||
this.msgId = msgId; |
|||
this.unikey = unikey; |
|||
this.error = error; |
|||
} |
|||
} |
|||
|
|||
private Data data; |
|||
|
|||
public ServerAckMessage(){ |
|||
setType(MessageConstant.ServerMessageType.Ack.name()); |
|||
} |
|||
|
|||
public ServerAckMessage(MessageConstant.Error status){ |
|||
this(); |
|||
this.data = new Data(null,null,status); |
|||
} |
|||
|
|||
public ServerAckMessage(String msgId,String unikey,MessageConstant.Error status){ |
|||
this(); |
|||
this.data = new Data(msgId,unikey,status); |
|||
} |
|||
} |
@ -1,188 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> |
|||
<component name="FacetManager"> |
|||
<facet type="Spring" name="Spring"> |
|||
<configuration /> |
|||
</facet> |
|||
</component> |
|||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8"> |
|||
<output url="file://$MODULE_DIR$/target/classes" /> |
|||
<output-test url="file://$MODULE_DIR$/target/test-classes" /> |
|||
<content url="file://$MODULE_DIR$"> |
|||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> |
|||
<excludeFolder url="file://$MODULE_DIR$/target" /> |
|||
</content> |
|||
<orderEntry type="inheritedJdk" /> |
|||
<orderEntry type="sourceFolder" forTests="false" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" /> |
|||
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.28" level="project" /> |
|||
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" /> |
|||
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.10.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.10.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.10.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.39.Final" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.39.Final" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.39.Final" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.39.Final" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.39.Final" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.39.Final" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.12.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.9" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.9" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.9" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.17.Final" level="project" /> |
|||
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.3.Final" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jetty:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-servlets:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-continuation:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-http:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-util:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-io:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-webapp:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-xml:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-servlet:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-security:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-server:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-server:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-common:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-api:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-client:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-client:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-servlet:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:javax-websocket-server-impl:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-annotations:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-plus:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.ow2.asm:asm:7.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.ow2.asm:asm-commons:7.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.ow2.asm:asm-tree:7.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.ow2.asm:asm-analysis:7.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:javax-websocket-client-impl:9.4.19.v20190610" level="project" /> |
|||
<orderEntry type="library" name="Maven: javax.websocket:javax.websocket-api:1.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.mortbay.jasper:apache-el:8.5.40" level="project" /> |
|||
<orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework.boot:spring-boot-devtools:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.8" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.11.1" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.23.4" level="project" /> |
|||
<orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.16" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.16" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.3" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-actuator:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator-autoconfigure:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.micrometer:micrometer-core:1.1.6" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.hdrhistogram:HdrHistogram:2.1.9" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.latencyutils:LatencyUtils:2.0.3" level="project" /> |
|||
<orderEntry type="library" name="Maven: cn.hutool:hutool-all:4.1.21" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.poi:poi:3.17" level="project" /> |
|||
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-websocket:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework:spring-websocket:5.1.9.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-amqp:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.amqp:spring-rabbit:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.amqp:spring-amqp:2.1.8.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.2.4.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.rabbitmq:amqp-client:5.4.3" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.1.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:4.1.4" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:0.9.5" level="project" /> |
|||
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.17" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.alibaba:druid:1.1.10" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.7.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.9.3" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.9" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.9.9" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.codehaus.woodstox:stax2-api:3.1.4" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.fasterxml.woodstox:woodstox-core:5.0.3" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" /> |
|||
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.2" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: net.sourceforge.htmlcleaner:htmlcleaner:2.22" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.jdom:jdom2:2.0.6" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.28" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" /> |
|||
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.mybatis.generator:mybatis-generator-core:1.3.7" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.beanshell:bsh:2.0b5" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.3.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.3.1" level="project" /> |
|||
<orderEntry type="library" name="Maven: com.github.qcloudsms:qcloudsms:1.0.5" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.json:json:20170516" level="project" /> |
|||
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.9" level="project" /> |
|||
</component> |
|||
</module> |
Loading…
Reference in new issue