我有一個在本地tomcat實例中運行得很好的應用程序 - 這是一個cassandra客戶端應用程序,它使用Hector作爲Cassandra的客戶端庫。有什麼不同:運行在本地tomcat vs雲代工
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(我們自己內部的雲計算,我們有一個簡單的應用程序使用如下代碼創建一個密鑰空間和列族(如果它不存在)卡桑德拉服務),上面有一個異常「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)
一堆谷歌搜索的,它看起來像麻煩的是,赫克託代碼試圖添加到一個不變列表 - java.util.AbstractList。但是,再次,該代碼在我的本地tomcat實例上運行良好,所以我想在jdk中有所不同?也許?我在本地運行java 7(sun)並推送選擇java 7.任何人有任何想法?
有趣的想法和從新的hector版本中刪除的約束肯定是一個合理的解釋。但是hector-cor-1.1-2.jar是我推動的戰爭文件的一部分。一些傳遞依賴是由dea上的某些東西滿足的,而不是在我的本地tomcat或jetty中? (也在當地碼頭工作)。任何想法如何我可以診斷這個? – 2013-02-13 01:36:10
如果您的web服務器庫文件夾下存在一個較舊的'hector'庫,它可能會導致此類問題,請參閱我的更新回答 – iTech 2013-02-13 02:38:21
iTech - 您是絕對正確的。在我的/ var/vcap/data/dea/apps/myapp/webapps/ROOT/WEB-INF/lib /目錄(以及較新的jar)中有一箇舊版本的hector core jar。所以,現在這是10K美元的問題 - 它是如何到達那裏的?這不是我推送的戰爭檔案。 – 2013-02-13 04:25:16