我有一个在本地 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/

10-09 09:43