From b8653504b647aa18e8fbf72121e06090fa2bf734 Mon Sep 17 00:00:00 2001 From: tangmingyou <234767776@qq.com> Date: Tue, 7 Jun 2022 18:12:24 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BE=A4=E8=81=8A=E6=B6=88=E6=81=AF=E8=BD=AC?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopod/soim/client/cmd/args/ArgsSend.java | 5 ++- .../soim/client/handler/cmd/SendHandler.java | 31 ++++++++++++---- .../java/net/sopod/soim/common/util/Func.java | 4 +++ im-das-api/im-das-message-api/pom.xml | 5 +++ im-entry/pom.xml | 5 +++ .../handlers/chat/ReqGroupMessageHandler.java | 35 ++++++++++++++++++- .../main/resources/proto/group/Group.proto | 2 -- .../logic/api/message/mode/GroupMessage.java | 2 ++ im-service/im-logic-message/pom.xml | 8 +++++ .../service/ImGroupChatServiceImpl.java | 1 - .../src/main/resources/application.yml | 5 +++ .../service/MessageRouteServiceImpl.java | 12 ++++--- .../router/service/RouterUserService.java | 3 +- .../src/main/resources/application.yml | 2 +- 14 files changed, 102 insertions(+), 18 deletions(-) diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/args/ArgsSend.java b/im-client/src/main/java/net/sopod/soim/client/cmd/args/ArgsSend.java index a63e8f0..2882d82 100644 --- a/im-client/src/main/java/net/sopod/soim/client/cmd/args/ArgsSend.java +++ b/im-client/src/main/java/net/sopod/soim/client/cmd/args/ArgsSend.java @@ -17,7 +17,10 @@ public class ArgsSend { @Parameter private List parameters; - @Parameter(names = {"-u", "-account"}, required = true, description = "接收者") + @Parameter(names = {"-u", "account"}, required = false, description = "接收者") private String account; + @Parameter(names = {"-g", "group"}, required = false, description = "接收者") + private Long groupId; + } diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/cmd/SendHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/cmd/SendHandler.java index 59ec0c6..16683bf 100644 --- a/im-client/src/main/java/net/sopod/soim/client/handler/cmd/SendHandler.java +++ b/im-client/src/main/java/net/sopod/soim/client/handler/cmd/SendHandler.java @@ -7,8 +7,12 @@ import net.sopod.soim.client.cmd.args.ArgsSend; import net.sopod.soim.client.cmd.handler.CmdHandler; import net.sopod.soim.client.logger.Console; import net.sopod.soim.client.session.SoImSession; +import net.sopod.soim.common.util.ImClock; import net.sopod.soim.common.util.StringUtil; import net.sopod.soim.data.msg.chat.Chat; +import net.sopod.soim.data.msg.group.Group; + +import java.util.concurrent.CompletableFuture; /** * SendHandler @@ -34,12 +38,27 @@ public class SendHandler implements CmdHandler { Console.info("请输入要发送的内容"); return; } - Chat.TextChat textChat = Chat.TextChat.newBuilder() - .setMessage(message) - .setReceiverAccount(args.getAccount()) - .setSender(soImSession.getUid()) - .build(); - soImSession.justSend(textChat); + if (args.getAccount() != null) { + Chat.TextChat textChat = Chat.TextChat.newBuilder() + .setMessage(message) + .setReceiverAccount(args.getAccount()) + .setSender(soImSession.getUid()) + .build(); + soImSession.justSend(textChat); + } else if (args.getGroupId() != null) { + Group.ReqGroupMessage req = Group.ReqGroupMessage.newBuilder() + .setGid(args.getGroupId()) + .setMessage(message) + .setTime(ImClock.millis()) + .build(); + CompletableFuture future = soImSession.send(req); + Group.ResGroupMessage res = future.join(); + if (!res.getSuccess()) { + Console.info("发送失败: {}", res.getMessage()); + } else { + Console.info("发送成功: {}", res.getMessage()); + } + } } } diff --git a/im-common/src/main/java/net/sopod/soim/common/util/Func.java b/im-common/src/main/java/net/sopod/soim/common/util/Func.java index 392787f..949f3eb 100644 --- a/im-common/src/main/java/net/sopod/soim/common/util/Func.java +++ b/im-common/src/main/java/net/sopod/soim/common/util/Func.java @@ -8,4 +8,8 @@ package net.sopod.soim.common.util; */ public class Func { + public static T nullSo(T data, T so) { + return data == null ? data : so; + } + } diff --git a/im-das-api/im-das-message-api/pom.xml b/im-das-api/im-das-message-api/pom.xml index 90ae81a..04bcbff 100644 --- a/im-das-api/im-das-message-api/pom.xml +++ b/im-das-api/im-das-message-api/pom.xml @@ -33,6 +33,11 @@ spring-boot-starter-amqp provided + + org.msgpack + jackson-dataformat-msgpack + provided + org.xerial.snappy snappy-java diff --git a/im-entry/pom.xml b/im-entry/pom.xml index 93fa74e..c9f3abd 100644 --- a/im-entry/pom.xml +++ b/im-entry/pom.xml @@ -41,6 +41,11 @@ im-logic-group-api ${soim.version} + + net.sopod + im-logic-message-api + ${soim.version} + org.projectlombok lombok diff --git a/im-entry/src/main/java/net/sopod/soim/entry/handlers/chat/ReqGroupMessageHandler.java b/im-entry/src/main/java/net/sopod/soim/entry/handlers/chat/ReqGroupMessageHandler.java index b55e453..be7f8d0 100644 --- a/im-entry/src/main/java/net/sopod/soim/entry/handlers/chat/ReqGroupMessageHandler.java +++ b/im-entry/src/main/java/net/sopod/soim/entry/handlers/chat/ReqGroupMessageHandler.java @@ -1,23 +1,56 @@ package net.sopod.soim.entry.handlers.chat; import com.google.protobuf.MessageLite; +import net.sopod.soim.common.util.Func; +import net.sopod.soim.common.util.ImClock; import net.sopod.soim.data.msg.group.Group; import net.sopod.soim.entry.server.handler.AccountMessageHandler; import net.sopod.soim.entry.server.handler.ImContext; import net.sopod.soim.entry.server.session.Account; +import net.sopod.soim.logic.api.message.mode.GroupMessage; +import net.sopod.soim.logic.api.message.service.ImGroupChatService; +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import java.util.concurrent.CompletableFuture; + /** * ReqGroupMessageHandler * * @author tmy - * @date 2022-06-05 11:05 + * @date 2022-06-07 15:46 */ @Service public class ReqGroupMessageHandler extends AccountMessageHandler { + private static final Logger logger = LoggerFactory.getLogger(ReqGroupMessageHandler.class); + + @DubboReference + private ImGroupChatService imGroupChatService; + @Override public MessageLite handle(ImContext ctx, Account account, Group.ReqGroupMessage req) { + GroupMessage groupMessage = new GroupMessage() + .setSender(account.getUid()) + .setGid(req.getGid()) + .setTime(ImClock.millis()) + .setMessage(req.getMessage()); + CompletableFuture future = imGroupChatService.groupMessage(groupMessage); + future.whenComplete((res, err) -> { + Group.ResGroupMessage.Builder reqBuilder = Group.ResGroupMessage.newBuilder(); + if (err != null) { + logger.error("群消息发送失败: {}, {}, {}", req.getGid(), req.getSender(), req.getMessage(), err); + account.writeNow(ctx, reqBuilder.setSuccess(false) + .setMessage(Func.nullSo(err.getMessage(), "")) + .build()); + return; + } + account.writeNow(ctx, reqBuilder.setSuccess(true) + .setMessage(Func.nullSo(res, "")) + .build()); + }); return null; } diff --git a/im-service-api/im-entry-protocol/src/main/resources/proto/group/Group.proto b/im-service-api/im-entry-protocol/src/main/resources/proto/group/Group.proto index bb6d3c6..851c619 100644 --- a/im-service-api/im-entry-protocol/src/main/resources/proto/group/Group.proto +++ b/im-service-api/im-entry-protocol/src/main/resources/proto/group/Group.proto @@ -68,8 +68,6 @@ message ResGroupUsers { // 文本聊天消息 message ReqGroupMessage { - // 发送者uid - int64 sender = 1; // 群聊id int64 gid = 2; // 文本消息内容 diff --git a/im-service-api/im-logic-message-api/src/main/java/net/sopod/soim/logic/api/message/mode/GroupMessage.java b/im-service-api/im-logic-message-api/src/main/java/net/sopod/soim/logic/api/message/mode/GroupMessage.java index 4b16446..d8edd8d 100644 --- a/im-service-api/im-logic-message-api/src/main/java/net/sopod/soim/logic/api/message/mode/GroupMessage.java +++ b/im-service-api/im-logic-message-api/src/main/java/net/sopod/soim/logic/api/message/mode/GroupMessage.java @@ -1,6 +1,7 @@ package net.sopod.soim.logic.api.message.mode; import lombok.Data; +import lombok.experimental.Accessors; import java.io.Serializable; @@ -11,6 +12,7 @@ import java.io.Serializable; * @date 2022-06-05 11:10 */ @Data +@Accessors(chain = true) public class GroupMessage implements Serializable { private static final long serialVersionUID = 237146829521854337L; diff --git a/im-service/im-logic-message/pom.xml b/im-service/im-logic-message/pom.xml index bfc863b..d76abc9 100644 --- a/im-service/im-logic-message/pom.xml +++ b/im-service/im-logic-message/pom.xml @@ -78,6 +78,14 @@ org.springframework.boot spring-boot-starter-amqp + + org.msgpack + jackson-dataformat-msgpack + + + org.mybatis + mybatis + org.springframework.boot diff --git a/im-service/im-logic-message/src/main/java/net/sopod/soim/logic/message/service/ImGroupChatServiceImpl.java b/im-service/im-logic-message/src/main/java/net/sopod/soim/logic/message/service/ImGroupChatServiceImpl.java index 3b504bc..84b99f9 100644 --- a/im-service/im-logic-message/src/main/java/net/sopod/soim/logic/message/service/ImGroupChatServiceImpl.java +++ b/im-service/im-logic-message/src/main/java/net/sopod/soim/logic/message/service/ImGroupChatServiceImpl.java @@ -21,7 +21,6 @@ import javax.annotation.Resource; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; diff --git a/im-service/im-logic-message/src/main/resources/application.yml b/im-service/im-logic-message/src/main/resources/application.yml index 3bb3fec..298f0b9 100644 --- a/im-service/im-logic-message/src/main/resources/application.yml +++ b/im-service/im-logic-message/src/main/resources/application.yml @@ -1,6 +1,11 @@ spring: application: name: im-logic-message + rabbitmq: + host: 124.222.131.236 + port: 3672 + username: soim + password: sopod@rabbit# dubbo: application: diff --git a/im-service/im-router/src/main/java/net/sopod/soim/router/service/MessageRouteServiceImpl.java b/im-service/im-router/src/main/java/net/sopod/soim/router/service/MessageRouteServiceImpl.java index 18bb0e7..377125e 100644 --- a/im-service/im-router/src/main/java/net/sopod/soim/router/service/MessageRouteServiceImpl.java +++ b/im-service/im-router/src/main/java/net/sopod/soim/router/service/MessageRouteServiceImpl.java @@ -1,6 +1,7 @@ package net.sopod.soim.router.service; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import net.sopod.soim.router.api.service.MessageRouteService; import net.sopod.soim.router.cache.RouterUser; import net.sopod.soim.router.cache.RouterUserStorage; @@ -19,6 +20,7 @@ import java.util.List; */ @DubboService @AllArgsConstructor +@Slf4j public class MessageRouteServiceImpl implements MessageRouteService { private RouterUserService routerUserService; @@ -27,15 +29,15 @@ public class MessageRouteServiceImpl implements MessageRouteService { public List routeGroupMessage(List uids, String message) { RouterUserStorage storage = RouterUserStorage.getInstance(); List results = new ArrayList<>(uids.size()); - Iterator iterator = uids.iterator(); - for (int i = 0; iterator.hasNext(); i++) { - RouterUser routerUser = storage.get(iterator.next()); + for (Long uid : uids) { + RouterUser routerUser = storage.get(uid); + log.info("route group msg: {}, {}", uid, routerUser); if (routerUser == null) { - results.set(i, false); + results.add(false); continue; } Boolean success = routerUserService.routeGroupMessage(routerUser, message); - results.set(i, Boolean.TRUE.equals(success)); + results.add(Boolean.TRUE.equals(success)); } return results; } diff --git a/im-service/im-router/src/main/java/net/sopod/soim/router/service/RouterUserService.java b/im-service/im-router/src/main/java/net/sopod/soim/router/service/RouterUserService.java index d8fd95d..58b2aec 100644 --- a/im-service/im-router/src/main/java/net/sopod/soim/router/service/RouterUserService.java +++ b/im-service/im-router/src/main/java/net/sopod/soim/router/service/RouterUserService.java @@ -25,12 +25,13 @@ public class RouterUserService { } public Boolean routeGroupMessage(RouterUser receiverUser, String message) { - RpcContextUtil.setContextUid(receiverUser.getUid()); TextChat textChat = new TextChat() + .setUid(receiverUser.getUid()) // TODO 群消息优化 .setReceiverUid(receiverUser.getUid()) .setMessage(message) .setTime(ImClock.millis()) .setReceiverName(receiverUser.getAccount()); + RpcContextUtil.setContextUid(receiverUser.getUid()); return textChatService.sendTextChat(textChat); } diff --git a/im-service/im-router/src/main/resources/application.yml b/im-service/im-router/src/main/resources/application.yml index 9614a91..be1013f 100644 --- a/im-service/im-router/src/main/resources/application.yml +++ b/im-service/im-router/src/main/resources/application.yml @@ -25,7 +25,7 @@ dubbo: group: so-im protocol: name: dubbo - port: 3034 + port: 3035 # serialization: protobuf consumer: check: false