我有一个在本地 tomcat 实例中运行良好的应用程序 - 它是一个 cassandra 客户端应用程序,它使用 Hector 作为 Cassandra 的客户端库。应用程序使用如下代码创建键空间和列族(如果尚不存在):
final ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(keySpaceName,
columnFamilyName, ComparatorType.BYTESTYPE);
cfDef.setKeyValidationClass(ComparatorType.LONGTYPE.getClassName());
cfDef.setComparatorType(ComparatorType.UTF8TYPE);
cfDef.addColumnDefinition(new BasicColumnDefinition() {{
setName(StringSerializer.get().toByteBuffer("id"));
setValidationClass(ComparatorType.LONGTYPE.getClassName());
}});
当我将这个完全相同的应用程序推送到 Cloud Foundry(我们自己的内部云,其中有一个简单的 cassandra 服务)时,上面带有“addColumnDefinition”的行会导致异常 - 这是堆栈跟踪:
java.lang.UnsupportedOperationException
java.util.AbstractList.add(Unknown Source)
java.util.AbstractList.add(Unknown Source)
me.prettyprint.cassandra.service.ThriftCfDef.addColumnDefinition(ThriftCfDef.java:311)
org.pvtl.cassandra.HectorSample.createColumnFamily(HectorSample.java:94)
org.pvtl.cassandra.HectorSample.<init>(HectorSample.java:37)
org.apache.jsp.index_jsp._jspService(index_jsp.java:61)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
一堆谷歌搜索,看起来问题在于 Hector 代码试图添加到一个不可变列表 - java.util.AbstractList。但同样,该代码在我的本地 tomcat 实例上运行良好,所以我在考虑 jdk 的不同之处?也许?我在本地运行 java 7 (sun) 并插入选择 java 7。有人有任何想法吗?
最佳答案
很可能您在本地 tomcat 中使用的 Hector
版本与服务器中的版本不同(即服务器具有较旧的库),因为从较新的 Hector
版本中删除了不可变列表约束
See this pull request discussion
编辑
您可能需要检查您的服务器配置并确保它具有最新的 hector
库和/或检查 hector-cor-xxx.jar
是否存在 而不是 存在于您的 tomcat/jetty 库文件夹中,因为它可能会导致依赖性问题。
关于cassandra - Cloud Foundry 中的 : running in local tomcat vs. 有什么不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14843910/