|
@@ -33,13 +33,10 @@ import com.alibaba.otter.canal.protocol.ClientIdentity;
|
|
|
import com.alibaba.otter.canal.protocol.Message;
|
|
|
import com.alibaba.otter.canal.server.embedded.CanalServerWithEmbedded;
|
|
|
import com.alibaba.otter.canal.server.netty.NettyUtils;
|
|
|
+import com.google.protobuf.ByteString;
|
|
|
+import com.google.protobuf.CodedOutputStream;
|
|
|
+import com.google.protobuf.WireFormat;
|
|
|
|
|
|
-/**
|
|
|
- * 处理具体的客户端请求
|
|
|
- *
|
|
|
- * @author jianghang 2012-10-24 下午02:21:13
|
|
|
- * @version 1.0.0
|
|
|
- */
|
|
|
public class SessionHandler extends SimpleChannelHandler {
|
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(SessionHandler.class);
|
|
@@ -130,27 +127,57 @@ public class SessionHandler extends SimpleChannelHandler {
|
|
|
}
|
|
|
// }
|
|
|
|
|
|
- Packet.Builder packetBuilder = CanalPacket.Packet.newBuilder();
|
|
|
- packetBuilder.setType(PacketType.MESSAGES);
|
|
|
+ if (message.getId() != -1 && message.isRaw()) {
|
|
|
+ List<ByteString> rowEntries = message.getRawEntries();
|
|
|
+ // message size
|
|
|
+ int messageSize = 0;
|
|
|
+ messageSize += com.google.protobuf.CodedOutputStream.computeInt64Size(1, message.getId());
|
|
|
|
|
|
- Messages.Builder messageBuilder = CanalPacket.Messages.newBuilder();
|
|
|
- messageBuilder.setBatchId(message.getId());
|
|
|
- if (message.getId() != -1) {
|
|
|
- if (message.isRaw()) {
|
|
|
- // for performance
|
|
|
- if (!CollectionUtils.isEmpty(message.getRawEntries())) {
|
|
|
+ int dataSize = 0;
|
|
|
+ for (int i = 0; i < rowEntries.size(); i++) {
|
|
|
+ dataSize += com.google.protobuf.CodedOutputStream.computeBytesSizeNoTag(rowEntries.get(i));
|
|
|
+ }
|
|
|
+ messageSize += dataSize;
|
|
|
+ messageSize += 1 * rowEntries.size();
|
|
|
+ // packet size
|
|
|
+ int size = 0;
|
|
|
+ size += com.google.protobuf.CodedOutputStream.computeEnumSize(3,
|
|
|
+ PacketType.MESSAGES.getNumber());
|
|
|
+ size += com.google.protobuf.CodedOutputStream.computeTagSize(5)
|
|
|
+ + com.google.protobuf.CodedOutputStream.computeRawVarint32Size(messageSize)
|
|
|
+ + messageSize;
|
|
|
+ // TODO recyle bytes[]
|
|
|
+ byte[] body = new byte[size];
|
|
|
+ CodedOutputStream output = CodedOutputStream.newInstance(body);
|
|
|
+ output.writeEnum(3, PacketType.MESSAGES.getNumber());
|
|
|
+
|
|
|
+ output.writeTag(5, WireFormat.WIRETYPE_LENGTH_DELIMITED);
|
|
|
+ output.writeRawVarint32(messageSize);
|
|
|
+ // message
|
|
|
+ output.writeInt64(1, message.getId());
|
|
|
+ for (int i = 0; i < rowEntries.size(); i++) {
|
|
|
+ output.writeBytes(2, rowEntries.get(i));
|
|
|
+ }
|
|
|
+ output.checkNoSpaceLeft();
|
|
|
+ NettyUtils.write(ctx.getChannel(), body, null);
|
|
|
+ } else {
|
|
|
+ Packet.Builder packetBuilder = CanalPacket.Packet.newBuilder();
|
|
|
+ packetBuilder.setType(PacketType.MESSAGES);
|
|
|
+
|
|
|
+ Messages.Builder messageBuilder = CanalPacket.Messages.newBuilder();
|
|
|
+ messageBuilder.setBatchId(message.getId());
|
|
|
+ if (message.getId() != -1) {
|
|
|
+ if (message.isRaw() && !CollectionUtils.isEmpty(message.getRawEntries())) {
|
|
|
messageBuilder.addAllMessages(message.getRawEntries());
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (!CollectionUtils.isEmpty(message.getEntries())) {
|
|
|
+ } else if (!CollectionUtils.isEmpty(message.getEntries())) {
|
|
|
for (Entry entry : message.getEntries()) {
|
|
|
messageBuilder.addMessages(entry.toByteString());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ packetBuilder.setBody(messageBuilder.build().toByteString());
|
|
|
+ NettyUtils.write(ctx.getChannel(), packetBuilder.build().toByteArray(), null);// 输出数据
|
|
|
}
|
|
|
- packetBuilder.setBody(messageBuilder.build().toByteString());
|
|
|
- NettyUtils.write(ctx.getChannel(), packetBuilder.build().toByteArray(), null);// 输出数据
|
|
|
} else {
|
|
|
NettyUtils.error(401,
|
|
|
MessageFormatter.format("destination or clientId is null", get.toString()).getMessage(),
|