RMI を介して複数のリモート サーバーにワークロードを送信するプロジェクトを完了しようとしています。作業の最後に、各リモート サーバーは結果をデータベースに書き戻します。JPA (HIBERNATE はプロバイダー) をこのソリューションで動作させるには、いくつかの大きな問題があります。
UpdateDB メソッドを使用して、これらのリモート サーバーのいずれかのローカル データベースにデータを書き戻すことができれば、すべて正常に動作します。しかし、RMI を介して jar/code/classes を渡すと失敗します。例外が発生します:
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named PersistenceUnit
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69)
at cluster.persistence.UpdateDB.execute(UpdateDB.java:148)
at cluster.persistence.UpdateDB.execute(UpdateDB.java:1)
at cms.engine.ComputeEngine.executeTask(ComputeEngine.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
at com.sun.proxy.$Proxy0.executeTask(Unknown Source)
at cluster.persistence.UpdateDB.main(UpdateDB.java:93)
次のようにコードでpersistence.xmlにアクセスしようとすると:
try {
URL pUrl = UpdateDB.class.getClassLoader().getResource("META-INF/persistence.xml");
System.out.println(pUrl);
BufferedReader stream = null;
InputStream in = UpdateDB.class.getClassLoader().getResourceAsStream(
"META-INF/persistence.xml");
stream = new BufferedReader(new InputStreamReader(in));
String line = null;
line = stream.readLine();
while (line != null) {
line = stream.readLine();
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
persistenc.xml は正しい場所 (jar:htp://MYCODEBASE.jar!/META-INF/persistence.xml) からアクセスできます。また、persistence.xml 全体を正しく出力できます。
リモートサーバーがRMIセットアップでデータベースにデータを書き戻すことができるようにする方法を誰か教えてもらえますか?
どうもありがとう。