有时因为Corba服务的提供提供来自不同的厂商而可能出现服务的发布不断增加进而来在在java客户端需要依据idl来写很多代码,如果使用EJB的显示来调用corba则代码量更多一些。
从我的理解,无论是Corba 、Web Service 或是其他的协议,都是基于TCP协议并进行了简化来提供易用性。因此也都应该可以直接进行调用。
以下是java直接调用Corba服务的代码片段:
/**
* 模块名称 函数名称 输入(还可以增加服务的IP、端口等参数使之更灵活)
*/
public static String callCorbaDirect(String targetServiceName,
String funcName, Object input)
{
org.omg.CORBA.Object target = null;
InterfaceDef intf = null;
String serviceName = targetServiceName;
Properties p = new Properties();
p.put("org.omg.CORBA.ORBClass", "com.fujitsu.ObjectDirector.CORBA.ORB");
p.put("org.omg.CORBA.ORBSingletonClass", "com.fujitsu.ObjectDirector.CORBA.SingletonORB");
p.put("org.omg.CORBA.ORBInitialPort", "8002");// 端口
p.put("org.omg.CORBA.ORBInitialHost", "*.*.*.*");// IP
p.put("org.omg.CORBA.PROVIDER_URL", "iiop://localhost:8002"); // 这边应该有一些是不需要的
ORB Orb =ORB.init(new String[] {}, p); //初始化ORB对象
try {
org.omg.CORBA.Object _tmpObj =
objRef = Orb.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
System.out.println("**初始化 intf 开始:"+serviceName+"***");
NameComponent nc = new NameComponent(serviceName, "");
System.out.println("**初始化 NameComponent 结束:"+nc.toString()+"***");
NameComponent NCo[] = { nc };
// Issuing resolve method of NamingService
target = (org.omg.CORBA.Object)(ncRef.resolve(NCo));
org.omg.CORBA.Object intf_obj = target._get_interface_def();
intf = InterfaceDefHelper.narrow(intf_obj);
System.out.println("**初始化 intf 结束***");
} catch (java.lang.Exception e) {
e.printStackTrace();
}
}
以上即完成了对Corba服务的引用,直接就可以使用相应的corba服务,更为适合一些常变化,业务要求不高的服务(代码没做什么优化)。
Tags: Java Corba
发表评论