近期因为业务需要,测试了几种Java连接.Net的方法,在此作个小结,以备网友共享(下述所用工具是VS2008和MyEclipse6.5)。
一、通过Web Service连接:
此种方式比较常用,网上相关的介绍文章也比较多,此次我的实现方法是:.Net的Web服务返回泛型List,Java借助中间件XFire(下载地址可搜索获得)调用服务,同样用泛型List接收。用100万条数据测试,从调用到接收完毕用时10~13秒(服务与调用在同一台机上进行)。实现步骤及示例代码下附。
二、通过Com组件连接(调用.Net dll):
此种方法测试时稍费了些周折,因为网上的有些文章介绍时缺少一些步骤,所以刚开始时总是连接不成功,实在可恨。本例的实现方法是:.Net返回字符串,Java用字符串接收,然后再将字符串处理后循环赋给相应的Class类。用100万条数据测试,从调用到数据处理完毕用时3~5秒(注意:不要对字符串进行控制台输出,否则你将耗费若干分钟)。实现步骤及示例代码见本系列文章之“Java连接.Net测试(二)”。
三、通过IBM WebSphere MQ连接:
IBM WebSphere MQ是收费的,并且有界面工具提供。我的实现方法是:.Net将字符串写入MQ通道,Java从通道获取字符串,再将字符串处理后循环赋给相应的Class类。用100万条数据测试,从调用到数据处理完毕用时2~5秒(注意:不要对字符串进行控制台输出,否则你将耗费若干分钟)。实现步骤及示例代码见本系列文章之“Java连接.Net测试(三)”。
四、通过Apache ActiveMQ连接:
Apache ActiveMQ与上述第三种方案实现原理相同,都是通过收发消息实现数据的共享,只不过这个是开源的,没有界面工具。.Net方的实现请参看文章“ActiveMQ在C#中的应用”,文章链接:http://blog.csdn.net/bodybo/archive/2010/06/04/5647968.aspx;java方的实现网上相关的文章也比较多,大家可在网上搜下。请注意:在用apache MQ前,请先配置好Java环境变量JAVA_HOME,否则运行apache MQ服务器时可能会有问题。在此要特别感谢一个客户玲玲小姐,她让我少走了弯路,大大缩减了我了解ActiveMQ的时间。
首先贴出通过Web Service连接的实现步骤及主要实现代码,如下:
一、返回基本数据类型(未用XFire):
1. 编写.net web service:
新建网站-ASP .NET WEB服务(“浏览”处的路径输入“http://localhost/ASPWebService”),编写完后进行发布(示例代码如下);
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
/// <summary>
/// TestService 的摘要说明
/// </summary>
[WebService(Namespace = "http://mytempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.None)]
public class TestService : System.Web.Services.WebService {
public TestService () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
[SoapRpcMethod(Action = "http://www.duansiyang.com/Rpc", RequestNamespace = "http://www.duansiyang.com/SU", ResponseNamespace = "http://www.duansiyang.com/SU")]
public long count(Int32 a, Int32 b) {
return (long)(a + b);
}
[WebMethod]
[SoapRpcMethod(Action = "http://www.duansiyang2.com/Rpc", RequestNamespace = "http://www.duansiyang2.com/SU", ResponseNamespace = "http://www.duansiyang2.com/SU")]
public double randomNumber()
{
Random random = new Random(1);
double radnext = random.NextDouble();
return radnext;
}
}
2. 编写java调用代码:
首先必须先导入axis及支持axis所需的包(axis压缩包的lib文件夹下);
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
public void testCount(int i, int j) {
String endPoint = "http://localhost/ASPWebService/TestService.asmx";
try {
//调用第一个方法count
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endPoint);
call.setOperationName(new QName("http://www.duansiyang.com/SU", "count"));
call.addParameter("a", XMLType.XSD_INTEGER, ParameterMode.IN);
call.addParameter("b", XMLType.XSD_INTEGER, ParameterMode.IN);
call.setReturnType(XMLType.XSD_LONG);
call.setUseSOAPAction(true);
call.setSOAPActionURI("http://www.duansiyang.com/Rpc");
Long k = (Long) call.invoke(new Object[]{i, j});
System.out.println("a + b = " + k);
//调用第二个方法randomNumber
service = new Service();
call = (Call) service.createCall();
call.setTargetEndpointAddress(endPoint);
call.setOperationName(new QName("http://www.duansiyang2.com/SU", "randomNumber"));
call.setReturnType(XMLType.XSD_DOUBLE);
call.setUseSOAPAction(true);
call.setSOAPActionURI("http://www.duansiyang2.com/Rpc");
Double m = (Double) call.invoke(new Object[0]);
System.out.println("随机数是:" + m);
} catch (Exception e) {
e.printStackTrace();
}
}
编写完后就可执行main方法进行调用。
二、返回List类型(借助XFire中间件):
1. 编写.net web service:
新建网站-ASP .NET WEB服务(“浏览”处的路径输入“http://localhost/ASPWebService”),编写完后进行发布(示例代码如下);
using System;
using System.Web;
using System.Collections.Generic;
using System.Web.Services;
using System.Web.Services.Protocols;
using aspwebservice.model;
[WebService(Namespace = "http://mytempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class TestService : System.Web.Services.WebService {
public TestService () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public List<User> getList()
{
List<User> list = new List<User>();
for (int i = 0; i < 300000; i++)
{
User user = new User();
user.UserId = i;
user.UserName = "aa" + i;
user.Password = "bb" + i;
list.Add(user);
}
return list;
}
}
2. 编写java调用代码:
当然首先要做的是下载XFire包,官方下载:http://xfire.codehaus.org/Download。
A> 新建Web Service Project,输入项目名,并选取下方的XFire选项,一路按要求创建下去。
B> 导入XFire及支持XFire所需的包(XFire压缩包的lib文件夹下,不必全部导入,按官网上的导包说明导入即可);
C> 在src目录下新建一个包;
D> 在刚建的Web Service Project项目名上右击,选Other-MyEclipse-web service-web service client;project选Web Service Project项目,并点选下面的XFire;下一步中:WSDL URL中输入net中的服务地址,如:http://localhost/ASPWebService/TestService.asmx?wsdl,package选src下的包,然后一路下去,MyEclipse会完成绝大部分的代码构建。
E> 在构建好的client类的main方法中添加,如:
public static void main(String[] args) {
TestServiceClient client = new TestServiceClient();
//create a default service endpoint
TestServiceSoap service = client.getTestServiceSoap();
ArrayOfUser array = service.getList(); //ArrayOfUser是包含返回值List<User>的类(自动生成的),User类也是自动生成的
List<User> list = array.getUser();
System.out.println(list.size());
// for (User user : list) {
// System.out.println(user.getUserId() + " " + user.getUserName() + " " + user.getPassword());
// }
System.exit(0);
}
通过Com组件连接及通过WebSphere MQ连接的实现分别见本系列文章之Java连接.Net测试(二)、Java连接.Net测试(三)。