基于java自身技术实现消息方式的系统间通信

这篇博客基本照搬了分布式java应用基础与实践一书的内容

java自带的远程调用分两种一种是rmi,一种是webservice



我们先看rmi(remote method invoke)#

使用rmi

看代码
/**
 * 《构建高性能的大型分布式Java应用》
 *  书中的示例代码
 *  版权所有   2008---2009
 */
package book.chapter1.rmi;


import java.rmi.Remote;
import java.rmi.RemoteException;




/**
 * 描述:服务器端的业务功能类
 *
 * @author bluedavy 
 * 创建时间: 2009-1-4
 */


public interface Business extends Remote{


	/**
	 * 显示客户端提供的信息,并返回
	 */
	public String echo(String message) throws RemoteException;
	public int add(int a,int b) throws RemoteException;
}


/**
 * 《构建高性能的大型分布式Java应用》
 *  书中的示例代码
 *  版权所有   2008---2009
 */
package book.chapter1.rmi.impl;


import java.rmi.RemoteException;


import javax.jws.WebService;


import book.chapter1.rmi.Business;


/**
 * 描述:
 *
 * @author bluedavy 
 * 创建时间: 2009-1-4
 */
@WebService
public class BusinessImpl implements Business {


	/* (non-Javadoc)
	 * @see book.chapter1.rmi.Business#echo(java.lang.String)
	 */
	public String echo(String message) throws RemoteException {
		if("quit".equalsIgnoreCase(message.toString())){
			System.out.println("Server will be shutdown!");
			System.exit(0);
		}
		System.out.println("Message from client: "+message);
		return "Server response:"+message;
	}


	@Override
	public int add(int a, int b) throws RemoteException {
		System.out.println("a+b");
		return a+b;
	}


}
package book.chapter1.rmi;
/**
 * 《构建高性能的大型分布式Java应用》
 *  书中的示例代码
 *  版权所有   2008---2009
 */
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;


import javax.xml.ws.Endpoint;


import book.chapter1.rmi.impl.BusinessImpl;


/**
 * 描述:基于RMI实现的服务器端
 *
 * @author bluedavy 
 * 创建时间: 2009-1-4
 */
public class Server {


	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		String name="BusinessDemo";
		Business business=new BusinessImpl();
		//UnicastRemoteObject.exportObject的第二个参数我也不知道有什么用
		UnicastRemoteObject.exportObject(business, 0);
		Registry registry=LocateRegistry.createRegistry(1099);
		registry.rebind(name, business);
	}


}


package book.chapter1.rmi;
/**
 * 《构建高性能的大型分布式Java应用》
 *  书中的示例代码
 *  版权所有   2008---2009
 */
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;


/**
 * 描述:基于RMI实现的客户端
 *
 * @author bluedavy 
 * 创建时间: 2009-1-4
 */
public class Client {


	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		//下面我没有写端口 那就默认是1099
		Registry registry=LocateRegistry.getRegistry("10.150.0.80");
		String name="BusinessDemo";
		Business business=(Business) registry.lookup(name);
		System.out.println(business.add(5, 4));
	}
}

我在两台机子上运行,在我自己机子上运行server端,在朋友电脑上运行的是client端,他那边有Clinet.java与Business.java#运行时报ClassNotFoundException#
把BusinessImpl也给他发过去后,就一切ok了#
他那么直接打印出一个9,我这边打印出a+b#


可见计算的过程确实是在我这边的#






使用webservice

/**
 * 《构建高性能的大型分布式Java应用》
 *  书中的示例代码
 *  版权所有   2008---2009
 */
package book.chapter1.webservice.impl;




/**
 * 描述:服务端对外暴露的接口
 *
 * @author bluedavy 
 * 创建时间: 2009-2-11
 */
public interface Business {


	/**
	 * 显示客户端提供的信息,并返回
	 */
	public String echo(String message);
	
}


/**
 * 《构建高性能的大型分布式Java应用》
 *  书中的示例代码
 *  版权所有   2008---2009
 */
package book.chapter1.webservice.impl;


import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;




/**
 * 描述:以webservice方式对外暴露的服务
 *
 * @author bluedavy 
 * 创建时间: 2009-2-11
 */
@WebService(name="Business",serviceName="BusinessService",targetNamespace="http://webservice.chapter1.book/client")
@SOAPBinding(style=SOAPBinding.Style.RPC)
public class BusinessImpl implements Business {


	/* (non-Javadoc)
	 * @see book.chapter1.webservice.Business#echo(java.lang.String)
	 */
	public String echo(String message) {
		if("quit".equalsIgnoreCase(message.toString())){
			System.out.println("Server will be shutdown!");
			System.exit(0);
		}
		System.out.println("Message from client: "+message);
		return "Server response:"+message;
	}


}
/**
 * 《构建高性能的大型分布式Java应用》
 *  书中的示例代码
 *  版权所有   2008---2009
 */
package book.chapter1.webservice;


import javax.xml.ws.Endpoint;


import book.chapter1.webservice.impl.BusinessImpl;


/**
 * 描述:基于Java Webservice实现的服务器端
 *
 * @author bluedavy 
 * 创建时间: 2009-2-11
 */
public class Server {


	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Endpoint.publish("http://localhost:9527/BusinessService", new BusinessImpl());
		System.out.println("Server has beed started");
	}


}

有了上面三个类之后,我们可以通过jdk bin目录下的wsimport命令来生成辅助调用代码,如下:


之后,我们发现jdk的工具给我们在book\chapter1\webservice\client下产生了两个类,Business.java,BusinessService.java#
这个两个类,我们其实可以不用看里面的细节(当然你要想看,那就看吧)
看看我们的client端
package book.chapter1.webservice;
/**
 * 《构建高性能的大型分布式Java应用》
 *  书中的示例代码
 *  版权所有   2008---2009
 */
import java.io.BufferedReader;
import java.io.InputStreamReader;


import book.chapter1.webservice.client.Business;
import book.chapter1.webservice.client.BusinessService;


/**
 * 描述:基于Webservice实现的客户端
 *
 * @author bluedavy 
 * 创建时间: 2009-1-4
 */
public class Client {


	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		BusinessService businessService=new BusinessService();
		Business business=businessService.getBusinessPort();
		BufferedReader systemIn=new BufferedReader(new InputStreamReader(System.in));
        while(true){
			String command=systemIn.readLine();
			if(command==null || "quit".equalsIgnoreCase(command.trim())){
				System.out.println("Client quit!");
				try{
					business.echo(command);
				}
				catch(Exception e){
					// IGNORE
				}
				System.exit(0);
			}
			System.out.println(business.echo(command));
		}
	}


}

另外如果把代码改成下面的样子
@WebService(name="Business12",serviceName="BusinessService12",targetNamespace="http://c.b.a/d")
@SOAPBinding(style=SOAPBinding.Style.RPC)
public class BusinessImpl implements Business {




生成的java类就是Business12与BusinessService12位于a.b.c.d包下


参考资料

分布式java应用基础与实践

说实话 下面这个关于rmi的分析 我没有看懂

http://guojuanjun.blog.51cto.com/277646/1423392/





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值