1

私は2つの部分からなるアプリケーションに取り組んでいます.1つはWebベースで、もう1つはデスクトップアプリケーションです。Webベースのアプリケーションは、両方のマシンがローカルエリアネットワークにあるデスクトップベースのアプリケーションを呼び出します。アプリケーションはJavaで書かれています。誰かが私に RMI を使うようアドバイスしてくれました。Web ベースのアプリケーションは RMIClient のように機能し、デスクトップ アプリケーションは RMIServer になります。Web ベースのアプリケーションでは、Spring Framework を使用しています。Spring は、内部で Java RMI を使用する RMI サービスに独自の方法を提供します。このパターンに基づいてプロトタイピングを行うことにしました。

Spring を使用して RMIClient を作成しました。以下のコードを参照してください。

package com.rmi.client;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MainController {

@RequestMapping("/callrmiserver")
public void callRMISever(){
    ApplicationContext ctx = new ClassPathXmlApplicationContext("ServiceBean.xml");
    System.out.print("before getbean");
    Hello hello = (Hello) ctx.getBean("helloService");
    System.out.print("i am greeting from "+hello.greeting());
   }

 }

ServiceBean.xml ファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<bean id="Helloservice" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
    <property name="serviceUrl" value="rmi://localhost:1009/Services" />
    <property name="serviceInterface" value="com.rmi.client.Hello" />
</bean>

インターフェースは次のようなものです:

package com.rmi.client;

public interface Hello {
  String greeting();
}

デスクトップベースの RMIServer は

package rmiapplication;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class RMIServer {
    public static void main(String[] args) throws RemoteException,  MalformedURLException {
       System.out.println("server conf...");
               LocateRegistry.createRegistry(1009);
               Hello hello = new HelloImpl();
               Naming.rebind("Services", hello);
               System.out.println("server.RMI Server is ready.");
        }

  }

メソッドの実装部分は次のとおりです:-

package rmiapplication;

java.rmi.RemoteException をインポートします。java.rmi.server.UnicastRemoteObject をインポートします。

public class HelloImpl extends UnicastRemoteObject implements Hello{

private static final long serialVersionUID = 6789759288861838122L;

public HelloImpl() throws RemoteException {
    }

    public String greeting() throws RemoteException {
        System.out.print("i am at server side call");
        return "greeting";
    }

    }

私が実行しているときは、rmiregistry、RMIServer、そして Web ベースのアプリケーションから始めて、完全なセットアップであり、java.rmi.NotBoundException を取得しています。

SEVERE: Servlet.service() for servlet [rmi] in context with path [/SpringRMIClient] threw exception [Request processing failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.rmi.client.RMIService#0' defined in class path resource [ServiceBean.xml]: Cannot resolve reference to bean 'Helloservice' while setting bean property 'Helloservice'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Helloservice' defined in class path resource [ServiceBean.xml]: Invocation of init method failed; nested exception is org.springframework.remoting.RemoteLookupFailureException: Could not find RMI service [rmi://localhost:1009/Services] in RMI registry; nested exception is        java.rmi.NotBoundException: Services] with root cause
    java.rmi.NotBoundException: Services
at sun.rmi.registry.RegistryImpl.lookup(Unknown Source)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at org.springframework.remoting.rmi.RmiClientInterceptor.lookupStub(RmiClientInterceptor.java:200)
at org.springframework.remoting.rmi.RmiClientInterceptor.prepare(RmiClientInterceptor.java:147)
at org.springframework.remoting.rmi.RmiClientInterceptor.afterPropertiesSet(RmiClientInterceptor.java:135)
at org.springframework.remoting.rmi.RmiProxyFactoryBean.afterPropertiesSet(RmiProxyFactoryBean.java:68)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1469)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1317)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1076)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:872)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.rmi.client.MainController.callRMISever(MainController.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:774)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:333)
at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:219)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:279)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

これで何が問題なのかわかりません。グーグルを試しましたが、成功しませんでした。これに基づいて2つの質問があります

  1. 上記の例外を削除する方法、LAN内の別のマシンでも試しました
  2. Web ベースのアプリケーションからデスクトップ アプリケーションをトリガーして実行を開始する最善の方法は何ですか。完全な問題のステートメントは、Web ベースのアプリケーションで実行されるコンパイラと、ローカル マシンで実行されるコンパイルされたコードがあることです。

ありがとうございました、

RMI を使用した Spring Web アプリケーションと Spring 以外のデスクトップ アプリケーションの通信に関連する問題に誰かが直面している場合は、私にメールしてください。

コミュニティのサポートに感謝します

4

1 に答える 1

1

spring サーバーと非 spring クライアントが rmi を介して問題を引き起こす状況があることがわかりました。ただし、これは、Spring サーバー以外と Spring クライアント (Web サーバーからデスクトップ アプリケーション) を使用している場合に可能です。私の場合、使用中に問題が発生しました

これが私のクライアントです

public void getRMIServer(){
    Registry registry = null;
    Hello stub;
    try {
        System.out.println("IN RMI CLients");
        registry = LocateRegistry.getRegistry("localhost");
        stub = (Hello) registry.lookup("yash");
        System.out.println(stub.greeting());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

これが私のサーバーです

public static void main(String[] args){
    try {
        System.out.println("RMI Server Started");
        HelloImpl hello = new HelloImpl();
        UnicastRemoteObject.unexportObject(hello, true);
        Hello stub = (Hello) UnicastRemoteObject.exportObject(hello, 0);
        Registry reg = LocateRegistry.createRegistry(1098);
        reg.rebind("yash", stub);
        System.out.println("server.RMI Server is ready.");
    } catch (Exception e) {
        e.printStackTrace();
    }

}

また、サーバーとクライアントの両方に常駐する共有リソースも必要でしたが、これは共通のインターフェイスに過ぎません。

package shared;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Map;
  public interface Start extends Remote{
  public void startRMI(Map<Object,Object> m) throws RemoteException;
  public void stopRMI() throws RemoteException;
}

共有リソースは、リモート インターフェイスを拡張するインターフェイスです

誰かが実用的な解決策を必要とする場合は、私に知らせてください

于 2012-04-20T08:02:15.353 に答える