作者 王勇

拉取模式,取消息基本完善

... ... @@ -39,21 +39,7 @@ spring:
username: rabbit
password: 123456
virtual-host: /
# 开启手动ack机制
# listener:
# simple:
# acknowledge-mode: manual
# # 开启 confrim 机制--保证消息发送到交换机
# publisher-confrim-type: simple
# # 开启 return 机制--保证消息从交换机分发到队列
# publisher-returns: true
# host: 192.168.1.63
# port: 5672
# username: mrz
# password: vmvnv1v2
# 多环境配置
profiles:
active: dev
... ... @@ -116,10 +102,6 @@ management:
shutdown:
enabled: true
path:
# 文件夹的位置,就一个文件夹
dir: xml
# 基础信息配置
info:
version: 1.0
... ...
... ... @@ -46,6 +46,11 @@
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>http-client</artifactId>
<version>3.7.0.RELEASE</version>
... ...
package com.sunyo.wlpt.message.bus.service.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author 子诚
* Description:
* 时间:2020/7/28 15:18
*/
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Value("${path.dir}")
private String dir;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/bus/**").addResourceLocations("file:" + dir + "/");
WebMvcConfigurer.super.addResourceHandlers(registry);
}
}
... ... @@ -19,6 +19,8 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
import java.util.concurrent.TimeoutException;
import static com.sunyo.wlpt.message.bus.service.common.Constant.RESULT_SUCCESS;
/**
* @author 子诚
* Description:
... ... @@ -29,6 +31,7 @@ import java.util.concurrent.TimeoutException;
@RequestMapping("bus/rabbit")
@RestController
public class RabbitController {
@Resource
private UserMessageBindingService userMessageBindingService;
... ... @@ -47,10 +50,58 @@ public class RabbitController {
* @throws IOException
* @throws TimeoutException
*/
@GetMapping("/test/consumer")
public void consumer() throws IOException, TimeoutException
@GetMapping("/consumer_one")
public ResultJson consumerOne(
@RequestParam(value = "receiver") String receiver,
@RequestParam(value = "SERV") String SERV,
@RequestParam(value = "VSHT") String VSHT,
@RequestParam(value = "RCVR") String RCVR)
{
try {
XmlData xmlData = XmlData.builder()
.receiver(receiver)
.serverName(SERV)
.virtualHostName(VSHT)
.queueName(RCVR)
.build();
ResultJson validate = xmlUtils.validateReceiveParam(xmlData);
if (!RESULT_SUCCESS.equals(validate.getCode())) {
return validate;
}
ResultJson result = directUtils.directConsumerByPull(xmlData);
return result;
} catch (IOException | TimeoutException e) {
return ResultJson.error(CustomExceptionType.RECEIVE_SERVER_EXCEPTION);
}
}
@GetMapping("/consumer_more")
public ResultJson consumerMore(
@RequestParam(value = "receiver") String receiver,
@RequestParam(value = "SERV") String SERV,
@RequestParam(value = "VSHT") String VSHT,
@RequestParam(value = "RCVR") String RCVR,
@RequestParam(value = "count", required = false) Integer count)
{
try {
XmlData xmlData = XmlData.builder()
.receiver(receiver)
.serverName(SERV)
.virtualHostName(VSHT)
.queueName(RCVR)
.build();
ResultJson validate = xmlUtils.validateReceiveParam(xmlData);
if (!RESULT_SUCCESS.equals(validate.getCode())) {
return validate;
}
if (count == null || count < 1) {
count = 1;
}
ResultJson result = directUtils.directConsumerByPullMore(xmlData, count);
return result;
} catch (IOException | TimeoutException e) {
return ResultJson.error(CustomExceptionType.RECEIVE_SERVER_EXCEPTION);
}
}
@PostMapping("/product/old")
... ...
... ... @@ -63,6 +63,11 @@ public class XmlData implements Serializable {
private String sender;
/**
* 接收者
*/
private String receiver;
/**
* 对应:标签 RCVR -> 指定接收者(队列名称)
*/
private String queueName;
... ...
package com.sunyo.wlpt.message.bus.service.domain.view;
import com.rabbitmq.http.client.domain.ExchangeInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author 子诚
* Description:自定义MQ返回信息
* 时间:2020/8/27 16:11
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ViewExchangeInfo implements Serializable {
private static final long serialVersionUID = -3353890396017709770L;
private String serverName;
private ExchangeInfo exchangeInfo;
}
... ...
... ... @@ -6,6 +6,8 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author 子诚
* Description:
... ... @@ -15,7 +17,8 @@ import lombok.NoArgsConstructor;
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ViewQueueInfo {
public class ViewQueueInfo implements Serializable {
private static final long serialVersionUID = -1016067862213381683L;
private String serverName;
private QueueInfo queueInfo;
... ...
... ... @@ -8,6 +8,9 @@ package com.sunyo.wlpt.message.bus.service.exception;
public enum CustomExceptionType {
MESSAGE_SUCCESS("10200", "消息发送成功"),
RECEIVE_SUCCESS("20200", "接收消息,成功!"),
RECEIVE_SERVER_EXCEPTION("20500", "服务器异常,接收消息失败!请联系管理员处理"),
SERVER_EXCEPTION("10500", "服务器异常,发送消息失败!"),
CLIENT_EXCEPTION("10400", "报文格式错误,请检查报文格式!"),
... ... @@ -27,6 +30,22 @@ public enum CustomExceptionType {
EXCHANGE_NO_EXIST("20405", "报文数据错误,交换机不存在!"),
ROUTING_KEY_NO_EXIST("20406", "报文数据错误,路由键不存在!"),
RECEIVE_RECEIVER_ERROR("30401", "请仔细检查,接收者不存在!"),
RECEIVE_SERVER_ERROR("30402", "参数错误,服务器名称不存在!"),
RECEIVE_HOST_ERROR("30403", "参数错误,虚拟主机名称不存在!"),
RECEIVE_QUEUE_ERROR("30404", "参数错误,队列名称不存在!"),
RECEIVE_SERVER_HOST_ERROR("30405", "请仔细检查,该虚拟主机不属于该MQ服务器!"),
RECEIVE_HOST_QUEUE_ERROR("30406", "请仔细检查,该队列不属于该虚拟主机!"),
RECEIVE_USER_SERVER_HOST_ERROR("30407", "请仔细检查,该用户无权操作此虚拟主机"),
RECEIVE_USER_QUEUE_ERROR("30408", "请仔细检查,该用户无权操作此队列"),
RECEIVE_RECEIVER_NO_EXIST("30411", "请仔细检查,接收者不能为空!"),
RECEIVE_PASSWORD_NO_EXIST("30412", "请仔细检查,接收者不能为空!"),
RECEIVE_SERVER_NO_EXIST("30413", "参数错误,服务器名称不能为空!"),
RECEIVE_HOST_NO_EXIST("30414", "参数错误,虚拟主机名称不能为空!"),
RECEIVE_QUEUE_NO_EXIST("30415", "参数错误,队列名称不能为空!"),
CLIENT_ERROR("400", "客户端异常"),
SYSTEM_ERROR("500", "系统服务异常"),
OTHER_ERROR("999", "其他未知异常");
... ...
... ... @@ -94,6 +94,15 @@ public interface BusQueueMapper {
List<BusQueue> validateBusQueue(BusQueue busQueue);
/**
* 校验队列是否存在,根据用户名以及队列名称
*
* @param username 用户名称
* @param queueName 队列名称
* @return
*/
List<BusQueue> validateByUserNameAndQueueName(@Param("username") String username, @Param("queueName") String queueName);
/**
* 仅,查询队列列表
*
* @param busQueue {@link BusQueue}
... ... @@ -110,6 +119,14 @@ public interface BusQueueMapper {
List<BusQueue> selectByUsername(String username);
/**
* 根据用户名查询队列信息
*
* @param queueName 队列名称
* @return
*/
BusQueue selectByQueueName(@Param("queueName") String queueName);
/**
* 根据用户名称和虚拟主机Id查询队列信息
*
* @param username 用户名称
... ...
... ... @@ -103,6 +103,18 @@ public interface UserInfoMapper {
List<UserInfo> validateUserInfo(UserInfo userInfo);
/**
* 校验用户信息
*
* @param username 用户名称
* @param serverName 服务器名称
* @param virtualHostName 虚拟主机名称
* @return
*/
List<UserInfo> validateUserInfoByParams(@Param("username") String username,
@Param("serverName") String serverName,
@Param("virtualHostName") String virtualHostName);
/**
* 根据队列中的用户名,虚拟主机名称和虚拟主机id,查询用户关系
*
* @param busQueue {@link BusQueue}
... ...
package com.sunyo.wlpt.message.bus.service.rabbit.utils;
import com.rabbitmq.http.client.Client;
import com.rabbitmq.http.client.domain.ExchangeInfo;
import com.rabbitmq.http.client.domain.QueueInfo;
import com.rabbitmq.http.client.domain.UserPermissions;
import com.sunyo.wlpt.message.bus.service.domain.BusServer;
import com.sunyo.wlpt.message.bus.service.domain.UserInfo;
import com.sunyo.wlpt.message.bus.service.domain.VirtualHost;
import com.sunyo.wlpt.message.bus.service.domain.view.ViewExchangeInfo;
import com.sunyo.wlpt.message.bus.service.domain.view.ViewQueueInfo;
import com.sunyo.wlpt.message.bus.service.utils.AESUtils;
... ... @@ -167,6 +169,13 @@ public class ClientUtils {
return reformatQueueInfo(busServer.getServerName(), queues);
}
/**
* 队列信息,重新格式化
*
* @param serverName MQ服务器名称
* @param queues 队列信息 {@link QueueInfo}
* @return
*/
public static List<ViewQueueInfo> reformatQueueInfo(String serverName, List<QueueInfo> queues)
{
List<ViewQueueInfo> list = new ArrayList<>();
... ... @@ -204,10 +213,74 @@ public class ClientUtils {
* @throws IOException
* @throws URISyntaxException
*/
public QueueInfo getViewQueues(BusServer busServer, String vHostName, String queueName) throws IOException, URISyntaxException
public ViewQueueInfo getViewQueues(BusServer busServer, String vHostName, String queueName) throws IOException, URISyntaxException
{
Client client = connectClient(busServer);
QueueInfo queue = client.getQueue(vHostName, queueName);
return queue;
ViewQueueInfo viewQueueInfo = ViewQueueInfo.builder().serverName(busServer.getServerName()).queueInfo(queue).build();
return viewQueueInfo;
}
/**
* 获取MQ界面的交换机信息,重载
*
* @param busServer MQ服务器信息
* @return
* @throws IOException
* @throws URISyntaxException
*/
public static List<ViewExchangeInfo> getViewExchanges(BusServer busServer) throws IOException, URISyntaxException
{
Client client = connectClient(busServer);
List<ExchangeInfo> exchanges = client.getExchanges();
List<ViewExchangeInfo> viewExchangeInfos = reformatExchangeInfo(busServer.getServerName(), exchanges);
return viewExchangeInfos;
}
public static List<ViewExchangeInfo> reformatExchangeInfo(String serverName, List<ExchangeInfo> exchanges)
{
List<ViewExchangeInfo> list = new ArrayList<>();
// 将获取到的队列信息,拼接一个属性,服务器名称
for (ExchangeInfo exchangeInfo : exchanges) {
ViewExchangeInfo viewExchangeInfo = ViewExchangeInfo.builder().serverName(serverName).exchangeInfo(exchangeInfo).build();
list.add(viewExchangeInfo);
}
return list;
}
/**
* 获取MQ界面的交换机信息,重载
*
* @param busServer MQ服务器信息
* @param vHostName 虚拟主机
* @return
* @throws IOException
* @throws URISyntaxException
*/
public static List<ViewExchangeInfo> getViewExchanges(BusServer busServer, String vHostName) throws IOException, URISyntaxException
{
Client client = connectClient(busServer);
List<ExchangeInfo> exchanges = client.getExchanges(vHostName);
List<ViewExchangeInfo> viewExchangeInfos = reformatExchangeInfo(busServer.getServerName(), exchanges);
return viewExchangeInfos;
}
/**
* 获取MQ界面的交换机信息,重载
*
* @param busServer MQ服务器信息
* @param vHostName 虚拟主机
* @param exchangeName 交换机名称
* @return
* @throws IOException
* @throws URISyntaxException
*/
public static ViewExchangeInfo getViewExchanges(BusServer busServer, String vHostName, String exchangeName) throws IOException, URISyntaxException
{
Client client = connectClient(busServer);
ExchangeInfo exchangeInfo = client.getExchange(vHostName, exchangeName);
ViewExchangeInfo viewExchangeInfo = ViewExchangeInfo.builder().serverName(busServer.getServerName()).exchangeInfo(exchangeInfo).build();
return viewExchangeInfo;
}
}
... ...
... ... @@ -6,12 +6,15 @@ import com.sunyo.wlpt.message.bus.service.exception.CustomExceptionType;
import com.sunyo.wlpt.message.bus.service.response.ResultJson;
import com.sunyo.wlpt.message.bus.service.utils.AESUtils;
import com.sunyo.wlpt.message.bus.service.utils.IdUtils;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
... ... @@ -74,59 +77,6 @@ public class DirectUtils {
}
}
/**
* DirectExchange的 消息消费者
*
* @throws IOException IO异常
* @throws TimeoutException 超时异常
*/
public void directConsumer(XmlData xmlData) throws IOException, TimeoutException
{
// 1、创建ConnectionFactory
Connection connection = getConnection(xmlData.getServerIp(), xmlData.getServerPort(),
xmlData.getVirtualHostName(), xmlData.getSuperUsername(), xmlData.getSuperPassword());
// 2、 通过Connection创建一个新的Channel
Channel channel = connection.createChannel();
// 3、设置绑定关系(队列、交换机名称、路由键名称)
// channel.queueBind(queueName, exchangeName, routingKeyName);
// 一次只接受一条未确认的消息
channel.basicQos(1);
// 4、开启监听Queue
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException
{
try {
// 0、获取出全局唯一的 信息业务id(messageId)
String messageId = properties.getMessageId();
// 必须保证 messageId 不为空,避免空指针异常
if (redisTemplate.opsForValue().setIfAbsent(messageId, "0", 10, TimeUnit.MINUTES)) {
// 消费成功,将redis中的 messageId 对应的value修改为 1
redisTemplate.opsForValue().set(messageId, "1", 10, TimeUnit.MINUTES);
// 手动ack
channel.basicAck(envelope.getDeliveryTag(), false);
log.info("接收到消息:" + new String(body, "UTF-8"));
} else {
// 获取redis中的value,如果是1,就手动ack。如果是0,就什么也不做(是0代表着,正在被消费中)
if ("1".equalsIgnoreCase(redisTemplate.opsForValue().get(messageId))) {
// 手动ack
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
} catch (Exception e) {
// 手动ack
channel.basicAck(envelope.getDeliveryTag(), false);
log.error("接收消息发送错误:" + e.getMessage());
}
}
};
// 消费消息
channel.basicConsume(xmlData.getQueueName(), false, consumer);
}
public ResultJson sendMessage(XmlData xmlData) throws IOException, TimeoutException
{
/**
... ... @@ -194,6 +144,160 @@ public class DirectUtils {
closeConnectionAndChanel(channel, connection);
return ResultJson.success(CustomExceptionType.MESSAGE_SUCCESS);
}
/**
* byte字节数组 转 String
*
* @param byteArray 字节数组
* @return
*/
public static String byteArrayToStr(byte[] byteArray)
{
if (byteArray == null) {
return null;
}
String str = new String(byteArray);
return str;
}
/**
* DirectExchange的 消息消费者(推模式)
*
* @throws IOException IO异常
* @throws TimeoutException 超时异常
*/
public List<String> directConsumerByPush(XmlData xmlData) throws IOException, TimeoutException
{
List<String> list = new ArrayList<>();
// 1、创建ConnectionFactory
Connection connection = getConnection(xmlData.getServerIp(), xmlData.getServerPort(),
xmlData.getVirtualHostName(), xmlData.getSuperUsername(), xmlData.getSuperPassword());
// 2、 通过Connection创建一个新的Channel
Channel channel = connection.createChannel();
// 一次只接受一条未确认的消息
channel.basicQos(1);
// 4、开启监听Queue
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException
{
try {
// 0、获取出全局唯一的 信息业务id(messageId)
String messageId = properties.getMessageId();
// 必须保证 messageId 不为空,避免空指针异常
if (redisTemplate.opsForValue().setIfAbsent(messageId, "0", 10, TimeUnit.MINUTES)) {
// 消费成功,将redis中的 messageId 对应的value修改为 1
redisTemplate.opsForValue().set(messageId, "1", 1, TimeUnit.MINUTES);
// 手动ack
channel.basicAck(envelope.getDeliveryTag(), false);
log.info("接收到消息:" + new String(body, "UTF-8"));
String message = new String(body, "UTF-8");
list.add(message);
} else {
// 获取redis中的value,如果是1,就手动ack。如果是0,就什么也不做(是0代表着,正在被消费中)
if ("1".equalsIgnoreCase(redisTemplate.opsForValue().get(messageId))) {
// 手动ack
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
} catch (Exception e) {
// 手动ack
channel.basicAck(envelope.getDeliveryTag(), false);
log.error("接收消息发送错误:" + e.getMessage());
}
}
};
// 消费消息
channel.basicConsume(xmlData.getQueueName(), false, consumer);
return list;
}
/**
* DirectExchange的 消息消费者(拉模式)
*
* @throws IOException IO异常
* @throws TimeoutException 超时异常
*/
public ResultJson directConsumerByPull(XmlData xmlData) throws IOException, TimeoutException
{
List<String> list = new ArrayList<>();
Connection connection = getConnection(xmlData.getServerIp(), xmlData.getServerPort(), xmlData.getVirtualHostName(), xmlData.getSuperUsername(), xmlData.getSuperPassword());
Channel channel = connection.createChannel();
channel.basicQos(1);
GetResponse response = channel.basicGet(xmlData.getQueueName(), false);
if (response != null && response.getMessageCount() >= 0) {
String messageId = response.getProps().getMessageId();
if (redisTemplate.opsForValue().setIfAbsent(messageId, "0", 1, TimeUnit.MINUTES)) {
redisTemplate.opsForValue().set(messageId, "1", 1, TimeUnit.MINUTES);
String data = byteArrayToStr(response.getBody());
list.add(data);
channel.basicAck(response.getEnvelope().getDeliveryTag(), false);
} else {
if ("1".equalsIgnoreCase(redisTemplate.opsForValue().get(messageId))) {
channel.basicAck(response.getEnvelope().getDeliveryTag(), false);
}
}
}
String message = list.get(0);
return StringUtil.isNullOrEmpty(message)
? ResultJson.error(CustomExceptionType.RECEIVE_SERVER_EXCEPTION)
: ResultJson.success(CustomExceptionType.RECEIVE_SUCCESS, message);
}
/**
* DirectExchange的 消息消费者(拉模式、批量拉取)
*/
public ResultJson directConsumerByPullMore(XmlData xmlData, Integer count) throws IOException, TimeoutException
{
List<String> list = new ArrayList<>();
String serverIp = xmlData.getServerIp();
Integer serverPort = xmlData.getServerPort();
String virtualHostName = xmlData.getVirtualHostName();
String superUsername = xmlData.getSuperUsername();
String superPassword = xmlData.getSuperPassword();
Connection connection = getConnection(serverIp, serverPort, virtualHostName, superUsername, superPassword);
Channel channel = connection.createChannel();
channel.basicQos(1);
while (list.size() < count) {
GetResponse response = channel.basicGet(xmlData.getQueueName(), false);
if (response != null) {
if (response.getMessageCount() >= 0) {
String messageId = response.getProps().getMessageId();
if (redisTemplate.opsForValue().setIfAbsent(messageId, "0", 1, TimeUnit.MINUTES)) {
redisTemplate.opsForValue().set(messageId, "1", 1, TimeUnit.MINUTES);
String data = byteArrayToStr(response.getBody());
list.add(data);
channel.basicAck(response.getEnvelope().getDeliveryTag(), false);
} else {
if ("1".equalsIgnoreCase(redisTemplate.opsForValue().get(messageId))) {
channel.basicAck(response.getEnvelope().getDeliveryTag(), false);
}
}
}
} else {
break;
}
}
int size = list.size();
if (0 < size && size < count) {
return new ResultJson<>("20200", "接收消息,成功!但是,该队列内只有" + size + "条消息", list);
}
return size > 0
? ResultJson.success(CustomExceptionType.RECEIVE_SUCCESS, list)
: ResultJson.error(CustomExceptionType.RECEIVE_SERVER_EXCEPTION);
}
}
... ...
... ... @@ -130,6 +130,11 @@ public class ResultJson<T> implements Serializable {
return new ResultJson<>(customExceptionType.getCode(), customExceptionType.getMsg());
}
public static ResultJson success(CustomExceptionType customExceptionType, Object data)
{
return new ResultJson<>(customExceptionType.getCode(), customExceptionType.getMsg(),data);
}
/**
* 请求出现异常时的响应数据封装
*
... ...
... ... @@ -90,6 +90,15 @@ public interface BusQueueService {
List<BusQueue> validateBusQueue(BusQueue busQueue);
/**
* 校验队列是否存在,根据用户名以及队列名称
*
* @param username 用户名称
* @param queueName 队列名称
* @return
*/
List<BusQueue> validateByUserNameAndQueueName(String username, String queueName);
/**
* 仅,查询队列列表
*
* @param busQueue {@link BusQueue}
... ... @@ -113,5 +122,12 @@ public interface BusQueueService {
*/
List<BusQueue> selectByUsername(String username);
/**
* 根据用户名查询队列信息
*
* @param queueName 队列名称
* @return
*/
BusQueue selectByQueueName(String queueName);
}
... ...
... ... @@ -134,6 +134,16 @@ public interface UserInfoService {
* @return
*/
ResultJson batchDeleteUserRelation(String ids) throws IOException, URISyntaxException;
/**
* 校验用户信息
*
* @param username 用户名称
* @param serverName 服务器名称
* @param virtualHostName 虚拟主机名称
* @return
*/
List<UserInfo> validateUserInfoByParams(String username, String serverName, String virtualHostName);
}
... ...
... ... @@ -170,6 +170,12 @@ public class BusQueueServiceImpl implements BusQueueService {
}
@Override
public List<BusQueue> validateByUserNameAndQueueName(String username, String queueName)
{
return busQueueMapper.validateByUserNameAndQueueName(username, queueName);
}
@Override
public List<BusQueue> getQueueList(BusQueue busQueue)
{
List<BusQueue> list = new ArrayList<>();
... ... @@ -202,5 +208,11 @@ public class BusQueueServiceImpl implements BusQueueService {
{
return busQueueMapper.selectByUsername(username);
}
@Override
public BusQueue selectByQueueName(String queueName)
{
return busQueueMapper.selectByQueueName(queueName);
}
}
... ...
... ... @@ -454,6 +454,12 @@ public class UserInfoServiceImpl implements UserInfoService {
? new ResultJson<>("200", "批量删除用户关系,成功!")
: new ResultJson<>("500", "批量删除用户关系,失败!");
}
@Override
public List<UserInfo> validateUserInfoByParams(String username, String serverName, String virtualHostName)
{
return userInfoMapper.validateUserInfoByParams(username, serverName, virtualHostName);
}
}
... ...
... ... @@ -10,7 +10,6 @@ import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
... ... @@ -30,6 +29,9 @@ public class XmlUtils {
private UserInfoService userInfoService;
@Resource
private BusQueueService busQueueService;
@Resource
private BusServerService busServerService;
@Resource
... ... @@ -41,9 +43,6 @@ public class XmlUtils {
@Resource
private RoutingKeyService routingKeyService;
@Value("${path.dir}")
private String dir;
/**
* 解析字符串类型的 xml
*
... ... @@ -140,9 +139,6 @@ public class XmlUtils {
return ResultJson.error(CustomExceptionType.ROUTING_KEY_NO_EXIST);
}
// 获取密码
// xmlData.setPassword(userList.get(0).getPassword());
// 获取服务器ip
xmlData.setServerPort(serverList.get(0).getServerPort());
// 获取服务器port
... ... @@ -153,7 +149,67 @@ public class XmlUtils {
xmlData.setSuperPassword(serverList.get(0).getSuperPassword());
ResultJson<XmlData> result = new ResultJson<>("200", "通过格式与数据校验", xmlData);
return result;
}
/**
* 消费消息的参数的校验
*
* @param xmlData
* @return
*/
public ResultJson validateReceiveParam(XmlData xmlData)
{
String receiver = xmlData.getReceiver();
String serverName = xmlData.getServerName();
String virtualHostName = xmlData.getVirtualHostName();
String queueName = xmlData.getQueueName();
if (StringUtil.isNullOrEmpty(receiver)) {
return ResultJson.error(CustomExceptionType.RECEIVE_RECEIVER_NO_EXIST);
}
if (StringUtil.isNullOrEmpty(serverName)) {
return ResultJson.error(CustomExceptionType.RECEIVE_SERVER_NO_EXIST);
}
if (StringUtil.isNullOrEmpty(virtualHostName)) {
return ResultJson.error(CustomExceptionType.RECEIVE_HOST_NO_EXIST);
}
if (StringUtil.isNullOrEmpty(queueName)) {
return ResultJson.error(CustomExceptionType.RECEIVE_QUEUE_NO_EXIST);
}
if (userInfoService.selectUserExist(receiver).size() == 0) {
return ResultJson.error(CustomExceptionType.RECEIVE_RECEIVER_ERROR);
}
BusServer busServer = busServerService.selectByServerName(serverName);
if (busServer == null) {
return ResultJson.error(CustomExceptionType.RECEIVE_SERVER_ERROR);
}
VirtualHost virtualHost = virtualHostService.selectByVirtualHostName(virtualHostName);
if (virtualHost == null) {
return ResultJson.error(CustomExceptionType.RECEIVE_HOST_ERROR);
}
if (!busServer.getId().equals(virtualHost.getServerId())) {
return ResultJson.error(CustomExceptionType.RECEIVE_SERVER_HOST_ERROR);
}
if (userInfoService.validateUserInfoByParams(receiver, serverName, virtualHostName).size() == 0) {
return ResultJson.error(CustomExceptionType.RECEIVE_USER_SERVER_HOST_ERROR);
}
BusQueue busQueue = busQueueService.selectByQueueName(queueName);
if (busQueue == null) {
return ResultJson.error(CustomExceptionType.RECEIVE_QUEUE_ERROR);
}
if (!virtualHost.getId().equals(busQueue.getVirtualHostId())) {
return ResultJson.error(CustomExceptionType.RECEIVE_HOST_QUEUE_ERROR);
}
if(busQueueService.validateByUserNameAndQueueName(receiver,queueName).size()==0){
return ResultJson.error(CustomExceptionType.RECEIVE_USER_QUEUE_ERROR);
}
xmlData.setServerIp(busServer.getServerIp());
xmlData.setServerPort(busServer.getServerPort());
xmlData.setSuperUsername(busServer.getSuperUsername());
xmlData.setSuperPassword(busServer.getSuperPassword());
ResultJson<XmlData> result = ResultJson.success("通过校验", xmlData);
return result;
}
}
... ...
... ... @@ -264,6 +264,14 @@
</where>
</select>
<select id="validateByUserNameAndQueueName" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from bus_queue
where username = #{username,jdbcType=VARCHAR}
and queue_name = #{queueName,jdbcType=VARCHAR}
</select>
<select id="selectByUsername" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
... ... @@ -271,6 +279,13 @@
where username = #{username,jdbcType=VARCHAR}
</select>
<select id="selectByQueueName" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from bus_queue
where queue_name = #{queueName,jdbcType=VARCHAR}
</select>
<select id="selectByUsernameAndHostId" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
... ...
... ... @@ -47,7 +47,7 @@
from user_info
<where>
username = #{username,jdbcType=VARCHAR}
and server_name= #{serverName,jdbcType=VARCHAR}
and server_name = #{serverName,jdbcType=VARCHAR}
</where>
</delete>
... ... @@ -261,7 +261,19 @@
group by username, server_name, server_id
</select>
<select id="validateUserInfo" resultType="com.sunyo.wlpt.message.bus.service.domain.UserInfo">
<select id="validateUserInfo" parameterType="com.sunyo.wlpt.message.bus.service.domain.BusQueue"
resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from user_info
<where>
username = #{username,jdbcType=VARCHAR}
and server_name = #{serverName,jdbcType=VARCHAR}
and virtual_host_name = #{virtualHostName,jdbcType=VARCHAR}
</where>
</select>
<select id="validateUserInfoByParams" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from user_info
... ...