将流入数据写入 TDengine 时出错
something wrong when writing influx data into TDengine
我正在尝试移植我的应用程序,该应用程序通过其无模式接口将 InfluxDb 数据写入 TDengine。我觉得应该很容易,其实不然。
Java代码如下:
public void batchInsert() {
JSONObject json = new JSONObject();
json.put("f0", "tt");
json.put("f1", "aa");
json.put("f2", "tt");
json.put("f3", "aa");
json.put("f4", "tt");
json.put("f5", "aa");
json.put("f6", "tt");
json.put("f7", "aa");
BatchPoints batchPoints = BatchPoints.database(database)
.precision(TimeUnit.MILLISECONDS)
.build();
for (int i = 0; i < 1; i++) {
Point point = Point.measurement(measurement)
.time(System.currentTimeMillis() - 3600000, TimeUnit.MILLISECONDS)
.addField("current", 10.2)
.addField("voltage", 219 + i)
.addField("phase", 0.32 + i)
.addField("strAtri", "123456781234567812345678")
.addField("json$j", json.toJSONString())
.tag("__deviceId__", "sensor" + i)
.build();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
batchPoints.point(point);
}
try {
JSONObject responseBody;
String sql = "CREATE DATABASE IF NOT EXISTS " + database
+ " REPLICA 1 QUORUM 1 DAYS 1 KEEP 365 UPDATE 2;";
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON);
header.set("Authorization", getBasicAuth("root", "taosdata"));
HttpEntity<String> httpEntity = new HttpEntity<>(sql, header);
responseBody = restTemplate.postForObject(tdengineUrl, httpEntity, JSONObject.class);
System.out.println("database=" + responseBody.get("status"));
System.out.println(batchPoints.lineProtocol());
ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(tdengineInfluxdbUrl, batchPoints.lineProtocol(), JSONObject.class);
if (responseEntity.getStatusCodeValue() == 204) {
System.out.println(responseEntity.getStatusCodeValue());
}
} catch (Exception e) {
e.printStackTrace();
}
我在控制台上得到了结果:
sensor,deviceId=sensor0 current=10.2,json$j="{"f6":"tt","f7":"aa","f0":"tt","f1 ":"aa","f2":"tt","f3":"aa","f4":"tt","f5":"aa"}",phase=0.32,strAtri="123456781234567812345678",电压=219i 1647569782596
org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 内部服务器错误: [{"code":"internal error","message":"[0x21f] 列长度无效"}]
在 org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:100)
在 org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:186)
在 org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:125)
在 org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
在 org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:782)
在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:740)
在 org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
在 org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:449)
在 com.rootcloud.controller.InfluxController.batchInsert(InfluxController.java:112)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.lang.reflect.Method.invoke(Method.java:498)
在 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)
在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)
在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)
在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
在 java.lang.Thread.run(Thread.java:748)
我不知道为什么,如果有人能指出我如何解决它,我将不胜感激。
谢谢,
对于json文本,双引号和逗号前应使用转义字符,
例如
"ste,t1=35 json_test=L"{"carNumber":"","image":"","outParkingSpace":1638927251000,"parkingSpaceStatus":0}" 1645329601000"
我正在尝试移植我的应用程序,该应用程序通过其无模式接口将 InfluxDb 数据写入 TDengine。我觉得应该很容易,其实不然。
Java代码如下:
public void batchInsert() {
JSONObject json = new JSONObject();
json.put("f0", "tt");
json.put("f1", "aa");
json.put("f2", "tt");
json.put("f3", "aa");
json.put("f4", "tt");
json.put("f5", "aa");
json.put("f6", "tt");
json.put("f7", "aa");
BatchPoints batchPoints = BatchPoints.database(database)
.precision(TimeUnit.MILLISECONDS)
.build();
for (int i = 0; i < 1; i++) {
Point point = Point.measurement(measurement)
.time(System.currentTimeMillis() - 3600000, TimeUnit.MILLISECONDS)
.addField("current", 10.2)
.addField("voltage", 219 + i)
.addField("phase", 0.32 + i)
.addField("strAtri", "123456781234567812345678")
.addField("json$j", json.toJSONString())
.tag("__deviceId__", "sensor" + i)
.build();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
batchPoints.point(point);
}
try {
JSONObject responseBody;
String sql = "CREATE DATABASE IF NOT EXISTS " + database
+ " REPLICA 1 QUORUM 1 DAYS 1 KEEP 365 UPDATE 2;";
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON);
header.set("Authorization", getBasicAuth("root", "taosdata"));
HttpEntity<String> httpEntity = new HttpEntity<>(sql, header);
responseBody = restTemplate.postForObject(tdengineUrl, httpEntity, JSONObject.class);
System.out.println("database=" + responseBody.get("status"));
System.out.println(batchPoints.lineProtocol());
ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(tdengineInfluxdbUrl, batchPoints.lineProtocol(), JSONObject.class);
if (responseEntity.getStatusCodeValue() == 204) {
System.out.println(responseEntity.getStatusCodeValue());
}
} catch (Exception e) {
e.printStackTrace();
}
我在控制台上得到了结果:
sensor,deviceId=sensor0 current=10.2,json$j="{"f6":"tt","f7":"aa","f0":"tt","f1 ":"aa","f2":"tt","f3":"aa","f4":"tt","f5":"aa"}",phase=0.32,strAtri="123456781234567812345678",电压=219i 1647569782596
org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 内部服务器错误: [{"code":"internal error","message":"[0x21f] 列长度无效"}] 在 org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:100) 在 org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:186) 在 org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:125) 在 org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) 在 org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:782) 在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:740) 在 org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674) 在 org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:449) 在 com.rootcloud.controller.InfluxController.batchInsert(InfluxController.java:112) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:626) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:733) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:748)
我不知道为什么,如果有人能指出我如何解决它,我将不胜感激。
谢谢,
对于json文本,双引号和逗号前应使用转义字符, 例如 "ste,t1=35 json_test=L"{"carNumber":"","image":"","outParkingSpace":1638927251000,"parkingSpaceStatus":0}" 1645329601000"