我使用的是Mule EE 3.9.0、Java 8和MSSQL 8.2.2.jre。
我们的应用程序是在mule流上开发的集成框架,它为某些流创建了db:insert (内部使用mule EE 3.9.0 DB模块)。
最近,我不得不调用mule flow中的JAVA组件来进行数据库调用,为此我使用了MSSQL-JDBC 8.2.2.jre8版本。之后,我在运行那些旧的db:insert mule流时出现了下面的错误:
ANTLR Tool version 4.7.2 used for code generation does not match the current runtime version 4.5.1ANTLR Runtime version 4.7.2 used for parser compilation does not match the current runtime version 4.5.1ERROR 2020-06-03 11:09:17,946 [DispatchThread: [com.ibm.mq.jmqi.remote.impl.RemoteSession[:/4867ad1f][connectionId=414D5143514D53544D4C303120202020F4F7865E01F7FB26]]] org.mule.exception.CatchMessagingExceptionStrategy:
********************************************************************************
Message : null (java.lang.ExceptionInInitializerError).
Payload Type : [B
Element : ........
Element XML : <db:insert config-ref="Generic_Database_Configuration" doc:name="Database" transactionalAction="NOT_SUPPORTED"> ...
Root Exception stack trace:
java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with UUID 59627784-3be5-417a-b9eb-8131a7286089 (expected aadb8d7e-aeef-4415-ad2b-8204d6cf042e or a legacy UUID).
at org.antlr.v4.runtime.atn.ATNDeserializer.deserialize(ATNDeserializer.java:153)
at com.microsoft.sqlserver.jdbc.SQLServerLexer.<clinit>(SQLServerLexer.java:424)
at com.microsoft.sqlserver.jdbc.SQLServerFMTQuery.<init>(SQLServerFMTQuery.java:100)
at com.microsoft.sqlserver.jdbc.SQLServerParameterMetaData.<init>(SQLServerParameterMetaData.java:347)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.getParameterMetaData(SQLServerPreparedStatement.java:3100)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.getParameterMetaData(SQLServerPreparedStatement.java:3111)
at org.apache.commons.dbcp2.DelegatingPreparedStatement.getParameterMetaData(DelegatingPreparedStatement.java:266)
at org.apache.commons.dbcp2.DelegatingPreparedStatement.getParameterMetaData(DelegatingPreparedStatement.java:266)
at org.mule.module.db.internal.resolver.param.QueryParamTypeResolver.getParameterTypes(QueryParamTypeResolver.java:52)
at org.mule.module.db.internal.resolver.param.DefaultParamTypeResolver.getParamTypesUsingMetadata(DefaultParamTypeResolver.java:74)
at org.mule.module.db.internal.resolver.param.DefaultParamTypeResolver.getParameterTypes(DefaultParamTypeResolver.java:49)
at org.mule.module.db.internal.domain.connection.AbstractDbConnection.getParamTypes(AbstractDbConnection.java:53)
at org.mule.module.db.internal.resolver.query.ParametrizedQueryResolver.getParameterTypes(ParametrizedQueryResolver.java:68)
at org.mule.module.db.internal.resolver.query.ParametrizedQueryResolver.resolve(ParametrizedQueryResolver.java:56)
at org.mule.module.db.internal.processor.AbstractSingleQueryDbMessageProcessor.executeQuery(AbstractSingleQueryDbMessageProcessor.java:48)
at org.mule.module.db.internal.processor.AbstractDbMessageProcessor.process(AbstractDbMessageProcessor.java:81)
at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)
at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:111)
at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:44)
at org.mule.processor.BlockingProcessorExecutor.executeNext(BlockingProcessorExecutor.java:88)
at org.mule.processor.BlockingProcessorExecutor.execute(BlockingProcessorExecutor.java:59)为什么mssql-jdbc与mule 3.9.0冲突,antlr不能再解析mule中的SQL?
我曾尝试将antlr- but和antlr-tool添加到POM依赖项中,但没有成功。如果我用7.0.0.jre替换mssql-jdbc版本8.2.2.jre,它开始工作正常(这是件好事),但我需要mssql-jdbc 8.2.2.jre的一些特性。
发布于 2020-06-04 01:11:48
似乎在使用的ANTLR版本中存在冲突,但它看起来不像是来自Mule。Mule 3.9.0使用ANTLR 3.5.x。该错误提到冲突发生在ANTLR 4.7.2和4.5.1之间。
也许一些连接器、驱动程序或jar库正在添加这些冲突的版本。JDBC SQL驱动程序正在使用其中一个版本。这是可以确认的,但看看堆栈跟踪中的最后一行:
java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with UUID 59627784-3be5-417a-b9eb-8131a7286089 (expected aadb8d7e-aeef-4415-ad2b-8204d6cf042e or a legacy UUID).
at org.antlr.v4.runtime.atn.ATNDeserializer.deserialize(ATNDeserializer.java:153)
at com.microsoft.sqlserver.jdbc.SQLServerLexer.<clinit>(SQLServerLexer.java:424)微软的SQLServerLexer类正在调用ANTLR4类ATNDeserializer。
也许Maven dependency tree可以帮助理解另一个版本的来源。
此外,使用Java verbose classloading (-verbose:class)可以显示类是从何处加载的。它可以作为附加选项添加到wrapper.conf中。
顺便说一句,如果你正在使用Mule EE 3.9.0,你真的应该考虑升级到有大量修复的Mule EE 3.9.4。
发布于 2020-06-04 23:20:52
mssql-jdbc.8.2.1.jre仅解析参数化的SQL查询,并使其预编译。在解析时,使用ANTLR运行时进行验证。在我的例子中,验证失败是因为我们使用了mule db:insert,如下所示:
<db:insert config-ref="Generic_Database_Configuration" doc:name="Database" transactionalAction="NOT_SUPPORTED">
<db:parameterized-query><![CDATA[insert into EIS.T_TABLE (ID, EXPIRY_TIMESTAMP, INSERT_TIMESTAMP, CC_DATA, CORRELATION_ID) values(#[db_data.ID], #[db_data.EXPIRY_TIMESTAMP.toString()], #[db_data.INSERT_TIMESTAMP.toString()], #[db_data.CC_DATA], #[db_data.MQ_CORRELATION_ID])]]></db:parameterized-query>
ANTLR运行时不喜欢参数化SQL中的'#‘、']’和'[‘。因此,我们替换了mule db:insert,如下所示,它工作得很好。
<db:insert config-ref="Generic_Database_Configuration" doc:name="Database" transactionalAction="NOT_SUPPORTED">
<db:parameterized-query><![CDATA[insert into EIS.T_TABLE (ID, EXPIRY_TIMESTAMP, INSERT_TIMESTAMP, CC_DATA, CORRELATION_ID) values(:ID, :EXP_TIME, :INSERT_TIME, :CC_DATA, :CORRELATION)]]></db:parameterized-query>
<db:in-param name="ID" type="NCHAR" value="#[db_data.ID]"/>
<db:in-param name="EXP_TIME" type="TIMESTAMP" value="#[db_data.EXPIRY_TIMESTAMP.toString()]"/>
<db:in-param name="INSERT_TIME" type="TIMESTAMP" value="#[db_data.INSERT_TIMESTAMP.toString()]"/>
<db:in-param name="CC_DATA" type="VARBINARY" value="#[db_data.CC_DATA]"/>
<db:in-param name="CORRELATION" type="NVARCHAR" value="#[db_data.CORRELATION_ID]"/>
https://stackoverflow.com/questions/62177392
复制相似问题