在spring中实现rmi回调(callback)功能

spring包装了rmi后,使我们得到几点便利:

不用调用rmic编译stub和skeleton

不用直接实现remote接口

不需要启动命名服务rmiregistry

但,却不支持原来rmi的回调功能。查阅许多网页也不得其解。

 

今天,想到一招,共享出来,如果大家有好办法欢迎回贴共享。

 

正常做法是:

回调一般是用在一群client端需要server来通知的情况,一般server就用Vector来保存client对象。

server端需要提供一个方法,client把对象传过来后,保存到Vector中,以后就可以通知client们了:

register (ClientObject obj);

 

在spring里,基本做法是一样的,唯一不同是,在这个方法里,client不能传对象,我们就传一个client提供出来的rmi对象的url:

register(String url);

 

在client端,就如正常使用先获得server对象,再调用这个方法,注意组成url的代码:

 

        NodeService service  =  (NodeService) factory.getAPIObject( " nodeServiceProxy " );
        String name 
=   null ;
        
try   {
            name 
= "rmi://" + InetAddress.getLocalHost().getHostName() + "/NodeNotifyService";
        }
  catch  (Exception ue)  {}
        
int  result  =  service.registerFlower (name);
        logger.info (
" result= " + result);

 

在server端registerFlower处理里,根据url动态创建这个对象,代码如下:

 

public   class  NodeServiceImpl  implements  NodeService  {
    
public static final Logger logger = LoggerFactory.getLogger(NodeServiceImpl.class);
    
    
public NodeNotifyService service = null
    
    
public int registerFlower (String url) {
        logger.info (url);
        
        RmiProxyFactoryBean rmiProxyFactoryBean 
= new RmiProxyFactoryBean(); 
        rmiProxyFactoryBean.setServiceInterface(NodeNotifyService.
class); 
        
        logger.info (
"begin set url");
        rmiProxyFactoryBean.setServiceUrl(url);
        
        
try 
            logger.info (
"begin set");
            rmiProxyFactoryBean.afterPropertiesSet(); 
        }
 catch (Exception ex) 
            logger.info (
"exception");
        }
 

        
if (rmiProxyFactoryBean.getObject() instanceof NodeNotifyService) 
            service 
= (NodeNotifyService) rmiProxyFactoryBean.getObject(); 
        }


        
return 0;
    }

}



这样就从url转换成client对象了,当然了,还是需要在client和server各自配置文件里配置RmiServiceExporter,这一步很简单,和正常的spring的rmi是一样的了。

做到这步后,我还想把所有接口文件放到一个JAR里,client和server的实现,以及各自逻辑放到各自的JAR中,这样各自改实现就不需要两边更新包。改接口的话,就更新接口所在JAR。不知道这样安排是否合理?  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值