TDengine icon indicating copy to clipboard operation
TDengine copied to clipboard

java.sql.SQLException: JNI ERROR (2351): failed to create subscription

Open fengyunta opened this issue 3 years ago • 1 comments

tdengine-server version:2.6.0.28 tdengine-client version:2.6.0.28 服务器环境为centos7 服务端客户端分离部署后

客户端程序启动报错,客户端信息如下 客户端语言为Java,驱动包版本:2.0.38 客户端创建数据订阅报错: java.sql.SQLException: JNI ERROR (2351): failed to create subscription at com.taosdata.jdbc.TSDBError.createSQLException(TSDBError.java:75) at com.taosdata.jdbc.TSDBError.createSQLException(TSDBError.java:59) at com.taosdata.jdbc.TSDBConnection.subscribe(TSDBConnection.java:59) at com.jd.idc.edge.gather.sub.consumer.ConsumerConfig.initStart(ConsumerConfig.java:41) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:440) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414) at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) at com.jd.idc.edge.gather.EdgeGatherApplication.main(EdgeGatherApplication.java:12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)

程序代码如下: @Configuration public class ConsumerConfig {

private static final String topic = "topic-meter-current-bg-10";
private static final String sql = "select * from meters where current > 10";

@Value("${build}")
private boolean build;
@PostConstruct
public void initStart() {
	if(!build) {
		Connection connection = null;
		TSDBSubscribe subscribe = null;
		try {
			Class.forName("com.taosdata.jdbc.TSDBDriver");
            Properties properties = new Properties();
            properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
            properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
            String jdbcUrl = "jdbc:TAOS://192.168.56.10:6030/db_smartidc_containerdc?user=root&password=taosdata";
            connection = DriverManager.getConnection(jdbcUrl, properties);
            // create subscribe
            subscribe = ((TSDBConnection) connection).subscribe(topic, sql, true); 
            int count = 0;
            while (count < 10) {
                // wait 1 second to avoid frequent calls to consume
                TimeUnit.SECONDS.sleep(1); 
                // consume
                TSDBResultSet resultSet = subscribe.consume();
                if (resultSet == null) {
                    continue;
                }
                ResultSetMetaData metaData = resultSet.getMetaData();
                while (resultSet.next()) {
                    int columnCount = metaData.getColumnCount();
                    for (int i = 1; i <= columnCount; i++) {
                        System.out.print(metaData.getColumnLabel(i) + ": " + resultSet.getString(i) + "\t");
                    }
                    System.out.println();
                    count++;
                }
            }
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

}

fengyunta avatar Nov 01 '22 08:11 fengyunta

tdengine-2.6版本上的客户端和服务端分离 如果要使用订阅模式 ,不管是集群模式还是单点模式, 服务端和客户端必须先设置好自己的hostname 另外在td服务端部署的时候需要将firstEp配置好(单点将本机服务器的hostname配置上)。并且通过hostname能够ping通服务端和客户端,否则会出现上面的问题

fengyunta avatar Nov 01 '22 10:11 fengyunta

2.x 版本目前官方已经不维护支持了,请迁移升级到最新的 3.x 版本吧。操作手册为:https://www.taosdata.com/tdengine-engineering/17753.html。3.x 和 2.x 相比是全方位更加优越的,关于3.x 的主要特性可以结合这篇文章和官方文档一起了解:https://www.taosdata.com/tdengine-engineering/21550.html

开源版3.x 支持操作系统参考:https://docs.taosdata.com/reference/support-platform/

yu285 avatar May 17 '24 07:05 yu285