3

我有一个在本地 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。有人有什么想法吗?

4

1 回答 1

3

很可能您Hector在本地 tomcat 中使用的版本与服务器中的版本不同(即服务器具有较旧的库),因为不可变列表约束已从较新Hector版本中删除

请参阅此拉取请求讨论

编辑

您可能需要检查您的服务器配置并确保它具有最新的hector库和/或检查您的 tomcat/jetty 库文件夹下不存在的库,因为它可能会导致依赖性hector-cor-xxx.jar问题

于 2013-02-13T00:03:31.773 回答