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
private List<String> 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;
}

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.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<ArgsSend> {
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<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 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>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>jackson-dataformat-msgpack</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>

5
im-entry/pom.xml

@ -41,6 +41,11 @@
<artifactId>im-logic-group-api</artifactId>
<version>${soim.version}</version>
</dependency>
<dependency>
<groupId>net.sopod</groupId>
<artifactId>im-logic-message-api</artifactId>
<version>${soim.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<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;
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<Group.ReqGroupMessage> {
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<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;
}

2
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;
//

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;
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;

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

@ -78,6 +78,14 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>jackson-dataformat-msgpack</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<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.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

5
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:

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;
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<Boolean> routeGroupMessage(List<Long> uids, String message) {
RouterUserStorage storage = RouterUserStorage.getInstance();
List<Boolean> results = new ArrayList<>(uids.size());
Iterator<Long> 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;
}

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) {
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);
}

2
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

Loading…
Cancel
Save