使用Blitz实现JavaSpaces
我对这个论坛有很大的怀疑,但是我很高兴感到惊讶;)对于那些使我重回正轨的人,我感到很荣幸。
我正在尝试使用JavaSpaces的快速实现(http://www.dancres.org/blitz/blitz_js.html)来实现http://today.java.net/pub/a/today/提供的ComputeFarm示例。 2005/04/21 / farm.html
内存中的示例工作正常,但是每当我尝试使用"闪电战"现成的实现时,都会出现以下错误:
(是com.sun.jini.mahalo.TxnMgrProxy
在类路径中)
2008-09-24 09:57:37.316 ERROR [Thread-4] JavaSpaceComputeSpace 155 - Exception while taking task. java.rmi.ServerException: RemoteException in server thread; nested exception is: java.rmi.UnmarshalException: unmarshalling method/arguments; nested exception is: java.lang.ClassNotFoundException: com.sun.jini.mahalo.TxnMgrProxy at net.jini.jeri.BasicInvocationDispatcher.dispatch(BasicInvocationDispatcher.java:644) at com.sun.jini.jeri.internal.runtime.ObjectTable.run(ObjectTable.java:597) at net.jini.export.ServerContext.doWithServerContext(ServerContext.java:103) at com.sun.jini.jeri.internal.runtime.ObjectTable$Target.dispatch0(ObjectTable.java:595) at com.sun.jini.jeri.internal.runtime.ObjectTable$Target.access0(ObjectTable.java:212) at com.sun.jini.jeri.internal.runtime.ObjectTable.run(ObjectTable.java:568) at com.sun.jini.start.AggregatePolicyProvider.run(AggregatePolicyProvider.java:527) at java.security.AccessController.doPrivileged(Native Method) at com.sun.jini.jeri.internal.runtime.ObjectTable$Target.dispatch(ObjectTable.java:565) at com.sun.jini.jeri.internal.runtime.ObjectTable$Target.dispatch(ObjectTable.java:540) at com.sun.jini.jeri.internal.runtime.ObjectTable$RD.dispatch(ObjectTable.java:778) at net.jini.jeri.connection.ServerConnectionManager$Dispatcher.dispatch(ServerConnectionManager.java:148) at com.sun.jini.jeri.internal.mux.MuxServer.run(MuxServer.java:244) at com.sun.jini.start.AggregatePolicyProvider.run(AggregatePolicyProvider.java:513) at java.security.AccessController.doPrivileged(Native Method) at com.sun.jini.jeri.internal.mux.MuxServer.run(MuxServer.java:241) at com.sun.jini.thread.ThreadPool$Worker.run(ThreadPool.java:136) at java.lang.Thread.run(Thread.java:595) at com.sun.jini.jeri.internal.runtime.Util.__________EXCEPTION_RECEIVED_FROM_SERVER__________(Util.java:108) at com.sun.jini.jeri.internal.runtime.Util.exceptionReceivedFromServer(Util.java:101) at net.jini.jeri.BasicInvocationHandler.unmarshalThrow(BasicInvocationHandler.java:1303) at net.jini.jeri.BasicInvocationHandler.invokeRemoteMethodOnce(BasicInvocationHandler.java:832) at net.jini.jeri.BasicInvocationHandler.invokeRemoteMethod(BasicInvocationHandler.java:659) at net.jini.jeri.BasicInvocationHandler.invoke(BasicInvocationHandler.java:528) at $Proxy0.take(Unknown Source) at org.dancres.blitz.remote.BlitzProxy.take(BlitzProxy.java:157) at compute.impl.javaspaces.JavaSpaceComputeSpace.take(JavaSpaceComputeSpace.java:138) at example.squares.SquaresJob.collectResults(SquaresJob.java:47) at compute.impl.AbstractJobRunner$CollectThread.run(AbstractJobRunner.java:28) Caused by: java.rmi.UnmarshalException: unmarshalling method/arguments; nested exception is: java.lang.ClassNotFoundException: com.sun.jini.mahalo.TxnMgrProxy at net.jini.jeri.BasicInvocationDispatcher.dispatch(BasicInvocationDispatcher.java:619) at com.sun.jini.jeri.internal.runtime.ObjectTable.run(ObjectTable.java:597) at net.jini.export.ServerContext.doWithServerContext(ServerContext.java:103) at com.sun.jini.jeri.internal.runtime.ObjectTable$Target.dispatch0(ObjectTable.java:595) at com.sun.jini.jeri.internal.runtime.ObjectTable$Target.access0(ObjectTable.java:212) at com.sun.jini.jeri.internal.runtime.ObjectTable.run(ObjectTable.java:568) at com.sun.jini.start.AggregatePolicyProvider.run(AggregatePolicyProvider.java:527) at java.security.AccessController.doPrivileged(Native Method) at com.sun.jini.jeri.internal.runtime.ObjectTable$Target.dispatch(ObjectTable.java:565) at com.sun.jini.jeri.internal.runtime.ObjectTable$Target.dispatch(ObjectTable.java:540) at com.sun.jini.jeri.internal.runtime.ObjectTable$RD.dispatch(ObjectTable.java:778) at net.jini.jeri.connection.ServerConnectionManager$Dispatcher.dispatch(ServerConnectionManager.java:148) at com.sun.jini.jeri.internal.mux.MuxServer.run(MuxServer.java:244) at com.sun.jini.start.AggregatePolicyProvider.run(AggregatePolicyProvider.java:513) at java.security.AccessController.doPrivileged(Native Method) at com.sun.jini.jeri.internal.mux.MuxServer.run(MuxServer.java:241) at com.sun.jini.thread.ThreadPool$Worker.run(ThreadPool.java:136) at java.lang.Thread.run(Thread.java:595) Caused by: java.lang.ClassNotFoundException: com.sun.jini.mahalo.TxnMgrProxy at java.net.URLClassLoader.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at net.jini.loader.pref.PreferredClassLoader.loadClass(PreferredClassLoader.java:922) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:242) at net.jini.loader.pref.PreferredClassProvider.loadClass(PreferredClassProvider.java:613) at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247) at net.jini.loader.ClassLoading.loadClass(ClassLoading.java:138) at net.jini.io.MarshalInputStream.resolveClass(MarshalInputStream.java:296) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1544) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1908) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348) at com.sun.jini.jeri.internal.runtime.Util.unmarshalValue(Util.java:221) at net.jini.jeri.BasicInvocationDispatcher.unmarshalArguments(BasicInvocationDispatcher.java:1049) at net.jini.jeri.BasicInvocationDispatcher.dispatch(BasicInvocationDispatcher.java:599) ... 17 more
解决方案
好吧,Java Space服务器似乎找不到该类:
com.sun.jini.mahalo.TxnMgrProxy。
所以我想我们在启动服务器时只需将Mahalo(应根据以下内容包含在blitz发行版中:http://www.dancres.org/blitz/blitz_inst.html页)中。
如果此建议无济于事,请发布有关如何启动服务器的更多信息。
请注意我的原始帖子:是com.sun.jini.mahalo.TxnMgrProxy在类路径中
如果我们熟悉javap,则-如果指定完全限定的类名,它将确定它是否在类路径上。
这是我在运行javap com.sum.jini.mahalo.TxnMgrProxy时得到的结果:
C:\dev\jini\blitz>javap com.sun.jini.mahalo.TxnMgrProxy Compiled from "TxnMgrProxy.java" class com.sun.jini.mahalo.TxnMgrProxy extends java.lang.Object implements net.jini.core.transaction.server.TransactionManager,net.jini.admin.Admi nistrable,java.io.Serializable,net.jini.id.ReferentUuid{ final com.sun.jini.mahalo.TxnManager backend; final net.jini.id.Uuid proxyID; static com.sun.jini.mahalo.TxnMgrProxy create(com.sun.jini.mahalo.TxnManager, net.jini.id.Uuid); public net.jini.core.transaction.server.TransactionManager$Created create(long) throws net.jini.core.lease.LeaseDeniedException, java.r mi.RemoteException; public void join(long, net.jini.core.transaction.server.TransactionParticipant, long) throws net.jini.core.transaction.UnknownTransacti onException, net.jini.core.transaction.CannotJoinException, net.jini.core.transaction.server.CrashCountException, java.rmi.RemoteException; public int getState(long) throws net.jini.core.transaction.UnknownTransactionException, java.rmi.RemoteException; public void commit(long) throws net.jini.core.transaction.UnknownTransactionException, net.jini.core.transaction.CannotCommitException, java.rmi.RemoteException; public void commit(long, long) throws net.jini.core.transaction.UnknownTransactionException, net.jini.core.transaction.CannotCommitExce ption, net.jini.core.transaction.TimeoutExpiredException, java.rmi.RemoteException; public void abort(long) throws net.jini.core.transaction.UnknownTransactionException, net.jini.core.transaction.CannotAbortException, j ava.rmi.RemoteException; public void abort(long, long) throws net.jini.core.transaction.UnknownTransactionException, net.jini.core.transaction.CannotAbortExcept ion, net.jini.core.transaction.TimeoutExpiredException, java.rmi.RemoteException; public java.lang.Object getAdmin() throws java.rmi.RemoteException; public net.jini.id.Uuid getReferentUuid(); public int hashCode(); public boolean equals(java.lang.Object); com.sun.jini.mahalo.TxnMgrProxy(com.sun.jini.mahalo.TxnManager, net.jini.id.Uuid, com.sun.jini.mahalo.TxnMgrProxy); }
因此,com.sun.jini.mahalo.TxnMgrProxy包含在某个jar中,该jar包含在CLASSPATH环境变量中。
但是可能我们正在使用一些脚本来启动服务器。这很可能通过指定" -classpath"命令行开关来启动Java,该命令行开关优先于环境CLASSPATH变量。
http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/classpath.html
我们可以通过执行以下操作来模拟:
javap -classpath someUnknownJar.jar com.sun.jini.mahalo.TxnMgrProxy
……突然找不到该类了。因此,我们能否尝试找出启动客户端和服务器的Java VM的方式并提供完整的命令行。
(如果我们使用某种脚本,只需在java命令前面添加" echo ...",然后将输出粘贴到此处)。
确保指定-Djava.security.policy = / wherever / policy.all和-Djava.security.manager =我们可能还必须运行RMI代码服务器。
这看起来像是RMI类加载问题。似乎服务器进程正在尝试解组传递给它的TxnMgrProxy对象(我不知道示例的细节,我有点想从堆栈跟踪中猜测)。该对象需要使用可在其中找到类定义的代码库进行注释。我们可能需要确保Mahalo是通过java.rmi.server.codebase属性启动的,该属性指向一个URL,可以在其中下载mahalo-dl.jar(或者某些保存类定义的JAR)。
即使JAR在本地可用,也可能不够用。 PreferredClassProvider(它埋在堆栈跟踪中)篡改了常规的Java类加载器委派方案,因此,即使该类在本地存在,它仍然希望通过代码库提取该定义。
这些都是很难解决的问题。希望我能找到答案附近的东西。祝你好运。