2012-04-05 117 views
1

我的工作它由兩個部分的應用的一個基於Web的和其他的桌面應用程序,基於Web的應用程序將桌面呼叫應用兩種機器都在局域網。應用程序是用Java編寫的。有人建議我使用RMI。當基於Web的應用程序會像RMIClient和桌面應用程序會爲RMIServer。基於Web的應用程序,我們使用Spring框架Spring provied爲RMI服務以自己的方式在內部使用的Java RMI。我決定根據這種模式進行原型設計。基於無線通信從基於Web的應用基於桌面的應用

我現在已經創建了RMIClient使用Spring請參閱下面的代碼: -

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;

公共類HelloImpl擴展了UnicastRemoteObject實現您好{

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) 

現在,我不知道是什麼讓錯誤在這方面,我曾嘗試谷歌,但我已經在此基礎上

點的問題沒有得到任何成功的現在
  1. 如何刪除上述異常,我也試過用局域網中的不同機器
  2. 什麼是我們最好的方式從基於Web的應用程序觸發桌面應用程序,以便它開始執行。完整的問題陳述是我們有一個基於Web應用程序和本地計算機

謝謝您對遵守代碼運行運行編譯器,

我得到了解決,如果有人面臨着與春天的Web應用程序的任何問題並使用RMI非簧桌面應用程序通信寄給我

感謝您對社區的支持

回答

1

發現有一些情況下春天服務器和非簧客戶端通過RMI創建問題。但是這是可能的,當你使用非彈性的服務器和客戶端的彈簧(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; 
} 

共享資源是接口,即分機結束遠程接口

如果工作需要有人解決方案,請讓我知道