Browse Source

群聊消息转发

master
tangmingyou 4 years ago
parent
commit
b8653504b6
  1. 5
      im-client/src/main/java/net/sopod/soim/client/cmd/args/ArgsSend.java
  2. 31
      im-client/src/main/java/net/sopod/soim/client/handler/cmd/SendHandler.java
  3. 4
      im-common/src/main/java/net/sopod/soim/common/util/Func.java
  4. 5
      im-das-api/im-das-message-api/pom.xml
  5. 5
      im-entry/pom.xml
  6. 35
      im-entry/src/main/java/net/sopod/soim/entry/handlers/chat/ReqGroupMessageHandler.java
  7. 2
      im-service-api/im-entry-protocol/src/main/resources/proto/group/Group.proto
  8. 2
      im-service-api/im-logic-message-api/src/main/java/net/sopod/soim/logic/api/message/mode/GroupMessage.java
  9. 8
      im-service/im-logic-message/pom.xml
  10. 1
      im-service/im-logic-message/src/main/java/net/sopod/soim/logic/message/service/ImGroupChatServiceImpl.java
  11. 5
      im-service/im-logic-message/src/main/resources/application.yml
  12. 12
      im-service/im-router/src/main/java/net/sopod/soim/router/service/MessageRouteServiceImpl.java
  13. 3
      im-service/im-router/src/main/java/net/sopod/soim/router/service/RouterUserService.java
  14. 2
      im-service/im-router/src/main/resources/application.yml

5
im-client/src/main/java/net/sopod/soim/client/cmd/args/ArgsSend.java

@ -17,7 +17,10 @@ public class ArgsSend {
@Parameter @Parameter
private List<String> parameters; private List<String> parameters;
@Parameter(names = {"-u", "-account"}, required = true, description = "接收者") @Parameter(names = {"-u", "account"}, required = false, description = "接收者")
private String account; private String account;
@Parameter(names = {"-g", "group"}, required = false, description = "接收者")
private Long groupId;
} }

31
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.cmd.handler.CmdHandler;
import net.sopod.soim.client.logger.Console; import net.sopod.soim.client.logger.Console;
import net.sopod.soim.client.session.SoImSession; 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.common.util.StringUtil;
import net.sopod.soim.data.msg.chat.Chat; import net.sopod.soim.data.msg.chat.Chat;
import net.sopod.soim.data.msg.group.Group;
import java.util.concurrent.CompletableFuture;
/** /**
* SendHandler * SendHandler
@ -34,12 +38,27 @@ public class SendHandler implements CmdHandler<ArgsSend> {
Console.info("请输入要发送的内容"); Console.info("请输入要发送的内容");
return; return;
} }
Chat.TextChat textChat = Chat.TextChat.newBuilder() if (args.getAccount() != null) {
.setMessage(message) Chat.TextChat textChat = Chat.TextChat.newBuilder()
.setReceiverAccount(args.getAccount()) .setMessage(message)
.setSender(soImSession.getUid()) .setReceiverAccount(args.getAccount())
.build(); .setSender(soImSession.getUid())
soImSession.justSend(textChat); .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<Group.ResGroupMessage> future = soImSession.send(req);
Group.ResGroupMessage res = future.join();
if (!res.getSuccess()) {
Console.info("发送失败: {}", res.getMessage());
} else {
Console.info("发送成功: {}", res.getMessage());
}
}
} }
} }

4
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 class Func {
public static <T> T nullSo(T data, T so) {
return data == null ? data : so;
}
} }

5
im-das-api/im-das-message-api/pom.xml

@ -33,6 +33,11 @@
<artifactId>spring-boot-starter-amqp</artifactId> <artifactId>spring-boot-starter-amqp</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>jackson-dataformat-msgpack</artifactId>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>org.xerial.snappy</groupId> <groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId> <artifactId>snappy-java</artifactId>

5
im-entry/pom.xml

@ -41,6 +41,11 @@
<artifactId>im-logic-group-api</artifactId> <artifactId>im-logic-group-api</artifactId>
<version>${soim.version}</version> <version>${soim.version}</version>
</dependency> </dependency>
<dependency>
<groupId>net.sopod</groupId>
<artifactId>im-logic-message-api</artifactId>
<version>${soim.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>

35
im-entry/src/main/java/net/sopod/soim/entry/handlers/chat/ReqGroupMessageHandler.java

@ -1,23 +1,56 @@
package net.sopod.soim.entry.handlers.chat; package net.sopod.soim.entry.handlers.chat;
import com.google.protobuf.MessageLite; 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.data.msg.group.Group;
import net.sopod.soim.entry.server.handler.AccountMessageHandler; import net.sopod.soim.entry.server.handler.AccountMessageHandler;
import net.sopod.soim.entry.server.handler.ImContext; import net.sopod.soim.entry.server.handler.ImContext;
import net.sopod.soim.entry.server.session.Account; 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 org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
/** /**
* ReqGroupMessageHandler * ReqGroupMessageHandler
* *
* @author tmy * @author tmy
* @date 2022-06-05 11:05 * @date 2022-06-07 15:46
*/ */
@Service @Service
public class ReqGroupMessageHandler extends AccountMessageHandler<Group.ReqGroupMessage> { public class ReqGroupMessageHandler extends AccountMessageHandler<Group.ReqGroupMessage> {
private static final Logger logger = LoggerFactory.getLogger(ReqGroupMessageHandler.class);
@DubboReference
private ImGroupChatService imGroupChatService;
@Override @Override
public MessageLite handle(ImContext ctx, Account account, Group.ReqGroupMessage req) { 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<String> 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; return null;
} }

2
im-service-api/im-entry-protocol/src/main/resources/proto/group/Group.proto

@ -68,8 +68,6 @@ message ResGroupUsers {
// //
message ReqGroupMessage { message ReqGroupMessage {
// uid
int64 sender = 1;
// id // id
int64 gid = 2; int64 gid = 2;
// //

2
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; package net.sopod.soim.logic.api.message.mode;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
@ -11,6 +12,7 @@ import java.io.Serializable;
* @date 2022-06-05 11:10 * @date 2022-06-05 11:10
*/ */
@Data @Data
@Accessors(chain = true)
public class GroupMessage implements Serializable { public class GroupMessage implements Serializable {
private static final long serialVersionUID = 237146829521854337L; private static final long serialVersionUID = 237146829521854337L;

8
im-service/im-logic-message/pom.xml

@ -78,6 +78,14 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId> <artifactId>spring-boot-starter-amqp</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>jackson-dataformat-msgpack</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

1
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.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors; import java.util.stream.Collectors;

5
im-service/im-logic-message/src/main/resources/application.yml

@ -1,6 +1,11 @@
spring: spring:
application: application:
name: im-logic-message name: im-logic-message
rabbitmq:
host: 124.222.131.236
port: 3672
username: soim
password: sopod@rabbit#
dubbo: dubbo:
application: application:

12
im-service/im-router/src/main/java/net/sopod/soim/router/service/MessageRouteServiceImpl.java

@ -1,6 +1,7 @@
package net.sopod.soim.router.service; package net.sopod.soim.router.service;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.sopod.soim.router.api.service.MessageRouteService; import net.sopod.soim.router.api.service.MessageRouteService;
import net.sopod.soim.router.cache.RouterUser; import net.sopod.soim.router.cache.RouterUser;
import net.sopod.soim.router.cache.RouterUserStorage; import net.sopod.soim.router.cache.RouterUserStorage;
@ -19,6 +20,7 @@ import java.util.List;
*/ */
@DubboService @DubboService
@AllArgsConstructor @AllArgsConstructor
@Slf4j
public class MessageRouteServiceImpl implements MessageRouteService { public class MessageRouteServiceImpl implements MessageRouteService {
private RouterUserService routerUserService; private RouterUserService routerUserService;
@ -27,15 +29,15 @@ public class MessageRouteServiceImpl implements MessageRouteService {
public List<Boolean> routeGroupMessage(List<Long> uids, String message) { public List<Boolean> routeGroupMessage(List<Long> uids, String message) {
RouterUserStorage storage = RouterUserStorage.getInstance(); RouterUserStorage storage = RouterUserStorage.getInstance();
List<Boolean> results = new ArrayList<>(uids.size()); List<Boolean> results = new ArrayList<>(uids.size());
Iterator<Long> iterator = uids.iterator(); for (Long uid : uids) {
for (int i = 0; iterator.hasNext(); i++) { RouterUser routerUser = storage.get(uid);
RouterUser routerUser = storage.get(iterator.next()); log.info("route group msg: {}, {}", uid, routerUser);
if (routerUser == null) { if (routerUser == null) {
results.set(i, false); results.add(false);
continue; continue;
} }
Boolean success = routerUserService.routeGroupMessage(routerUser, message); Boolean success = routerUserService.routeGroupMessage(routerUser, message);
results.set(i, Boolean.TRUE.equals(success)); results.add(Boolean.TRUE.equals(success));
} }
return results; return results;
} }

3
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) { public Boolean routeGroupMessage(RouterUser receiverUser, String message) {
RpcContextUtil.setContextUid(receiverUser.getUid());
TextChat textChat = new TextChat() TextChat textChat = new TextChat()
.setUid(receiverUser.getUid()) // TODO 群消息优化
.setReceiverUid(receiverUser.getUid()) .setReceiverUid(receiverUser.getUid())
.setMessage(message) .setMessage(message)
.setTime(ImClock.millis()) .setTime(ImClock.millis())
.setReceiverName(receiverUser.getAccount()); .setReceiverName(receiverUser.getAccount());
RpcContextUtil.setContextUid(receiverUser.getUid());
return textChatService.sendTextChat(textChat); return textChatService.sendTextChat(textChat);
} }

2
im-service/im-router/src/main/resources/application.yml

@ -25,7 +25,7 @@ dubbo:
group: so-im group: so-im
protocol: protocol:
name: dubbo name: dubbo
port: 3034 port: 3035
# serialization: protobuf # serialization: protobuf
consumer: consumer:
check: false check: false

Loading…
Cancel
Save