У меня есть система, созданная вокруг брокера, так что мой производитель находится в Java, а потребитель в Go.
Я использую apache -пульсар в качестве моего брокера
Java - Производитель
Класс сообщения Java преобразуется в байтовый массив перед отправкой его в pulsar : объект класса Message Java вызывает getBytes () метод, определенный в том же классе для преобразования его в byte [], а затем этот массив отправляется в apache -pulsar
class MessageJava {
String id;
int entityId;
Date timestamp;
public byte[] getBytes() throws Exception{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
oos.flush();
return bos.toByteArray();
}
}
Мой потребитель написан на Go.
Go - Потребительский
байтовый массив считывается из пульсара и преобразуется в структуру Message Go с использованием метода ConvertAfterReceiving [определено ниже], я использую gob для декодирования :
type MessageGo struct {
Id string
EntityId int
Timestamp time.Time
}
func ConvertAfterReceiving(msg pulsar.Message) *MessageGo {
payload := msg.Payload()
messageBytes := bytes.NewBuffer(payload)
dec := gob.NewDecoder(messageBytes)
var message MessageGo
err := dec.Decode(&message)
if err != nil {
logging.Log.Error("error occurred in consumer while decoding message:", err)
}
return &message
}
Проблема в том, что я не могу декодировать байт [] и преобразовать его в структуру Message Go. Он показывает ошибку закодированное целое число без знака вне диапазона
Я попытался изменить Message Java .entityId на short / long и Message Go .EntityId на int8 / int16 / int32 / int64 / uint8 / uint16 / uint32 / uint64 [все перестановки], но все напрасно.