我正在尝试向碳( Graphite )服务器提供来自 Java 应用程序的数据。 我想使用 pickle 协议(protocol)而不是 oneline 协议(protocol),因为它似乎要快得多。
我已经在一个小的 python 脚本中完成了此操作,该脚本是从我的 Java 应用程序调用的。但我想用原生 Java 编写它。
Python 脚本如下所示:
listOfMetricTuples = [('test', (1, 1352903620)), ('test', (2, 1352903620))]
payload = pickle.dumps(listOfMetricTuples)
header = struct.pack("!L", len(payload))
message = header + payload
如果不需要包含任何库,那就太好了。
有人能解决这个问题吗?
最佳答案
现在已经解决了。
我通过使用 Jython 和以下代码解决了这个问题。
try{
Socket s = null;
try{
s = new Socket("debian-srv", 2004);
}catch(UnknownHostException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
if (s == null) {
return -1;
}
PyTuple t = new PyTuple(new PyString("Test.brange-debian.mojo"), new PyTuple(new PyInteger(1352975858), new PyInteger(56)));
PyTuple t2 = new PyTuple(new PyString("Test.brange-debian.mojo"), new PyTuple(new PyInteger(1352975858-60), new PyInteger(43)));
PyTuple t3 = new PyTuple(new PyString("Test.brange-debian.mojo"), new PyTuple(new PyInteger(1352975858-2*+60), new PyInteger(65)));
PyList list = new PyList();
list.append(t);
list.append(t2);
list.append(t3);
PyString payload = cPickle.dumps(list);
byte[] bytes = ByteBuffer.allocate(4).putInt(payload.__len__()).array();
s.getOutputStream().write(bytes);
s.getOutputStream().write(payload.toBytes());
s.getOutputStream().flush();
s.close();
}
catch (Exception e) {
e.printStackTrace();
}
关于java - Java 中的 python pickle.dumps 和 struct.pack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13380841/