微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RMI上的事务对象

如何解决RMI上的事务对象

我正在尝试做Java不可能做到的事情,但是也许有解决方案。

下面的代码尝试通过RMI传递事务对象

public class FileRepositoryImpl extends UnicastRemoteObject
    implements FileRepository {

  @Override
  public byte[] get(String appId,String filePath) throws remoteexception,NotBoundException {
    Registry registry = LocateRegistry.getRegistry();
    XodusRepository repository = (XodusRepository) registry.lookup(XodusRepository.class.getName());
    final byte[][] bytes = {null};
    repository.transact(appId,true,new Command<byte[]>() {
      @Override public byte[] execute(jetbrains.exodus.entitystore.StoreTransaction txn) {
         Entity entity = txn.findWithBlob(Constants.ENTITYSTORE_FILE,filePath).getLast();
         if (entity != null) {
          InputStream blobStream = entity.getBlob(filePath);
          bytes[0] = Try.of(() -> ByteStreams.toByteArray(blobStream)).getorNull();
         }
         return bytes[0];
      }
    });
    return bytes[0];
  }

}

但是此代码抛出:

java.rmi.ServerException: remoteexception occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.classNotFoundException: com.mycompany.backend.repository.FileRepositoryImpl$1 (no security manager: RMI class loader disabled)
    at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:391)
    at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
    at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
    at java.rmi/sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:283)
    at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:260)
    at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:161)
    at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:209)
    at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:161)
    at com.sun.proxy.$Proxy57.transact(UnkNown Source)
    at com.mycompany.backend.repository.FileRepositoryImpl.get(FileRepositoryImpl.java:48)
    at com.mycompany.backend.hosting.MyCompanyFileRepresentation.write(MyCompanyFileRepresentation.java:91)

另一方面,它具有另一个Java进程:

  @Override public <T> T transact(String appId,boolean isReadOnly,Command<T> command)
      throws NotBoundException,remoteexception {
    atomicreference<T> result = null;
    manager.transactPersistentEntityStore(xodusRoot,appId,isReadOnly,txn -> {
      result.set(command.execute(txn));
    });
    return Try.of(() -> result.get()).getorNull();
  }

是否可以通过RMI使用 transactional 对象?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。