nputStreamReader(receiverConnection.getInputStream()));
// 处理结果:"OK" 表示成功;"Exception" 表示输入流串行化异常
...
in.close();
} catch (Throwable e) {
e.printStackTrace(System.err);
}
}
注意到以上的documentReady()方法用remoteURL属性得到服务器上的CGI脚本的URL。为了与HTTP兼容,CGI脚本类用字符串”Content-type: text/html"封装接收者的输出。这个脚本然后调用服务器上的the receiverMain()方法。 Main()函数只是简单的实例化接收者然后调用其receiveDocument()方法。
import org.xbeans.communication.stdio.receiver.*;
public class receiverMain {
static Bean theReceiver = new Bean();
public static void main(String[] args) {
theReceiver.receiveDocument();
}
}
最后receiveDocument()方法的代码段将重新生成DOM表示以便进一步处理。这里用到了IBM的XML解析器。
DOMParser parser = new DOMParser(); // 构造解析器
try { // 调用解析器
parser.parse(new InputSource(System.in));
} catch (Throwable e) {
throw new XbeansException("","receiver","io error parsing incoming document",
"io error parsing incoming document "+e);
}
//将文档传向下一个bean
DOMListener.documentReady(new DOMEvent(this,parser.getDocument()));
方法二:通过JAVA远程方法调用串行化文档
这个方法通过JAVA远程方法调用(JAVA RMI)和DOM串行化(serialization)来从发送者向接收者传输XML DOM 文档。如图4:
用JAVA和XML构建分布式系统(3)
时间:2010-12-19
以下代码用JAVA远程方法调用实现发送方与接受方的通讯.
public void documentReady(DOMEvent evt) throws XbeansException {
if (DOMListener==null) {
try {
DOMListener = (DOMListener)Naming.lookup(getReceiverName());
} catch (Exception e) {
throw new XbeansException( evt.getDocument().getNodeName(),
"sender", "error obtaining remote receiver",
"The name may be wrong or the network may be down.");
}
}
DOMListener.documentReady(evt); }
以下是接受方的JAVA 远程方法调用的实现。setName()方法将接受这传送给RMI注册(registry),
documentReady()方法仅仅将接收到的文档传送给下一个组件。
public void setReceiverName(String newName) {
try {
if (receiverName!=null) Naming.unbind(receiverName);
receiverName = newName;
Naming.rebind(receiverName, this );
} catch( Exception e ) {
System.out.println( e );
}
}
public void documentReady(Document incomingDocument)
throws RemoteException, XbeansException {
if (DOMListener==null) {
throw new XbeansException(incomingDocument.getNodeName(),"rmiReceiver",
"next component not established", "The component needs to be configured.");
}
DOMListener.documentReady(new DOMEvent(this,incomingDocument));
}
方法三:CORBA-IIOP
第三方法用CORBA-IIOP(CORBA over Internet Inter-ORB Protocol)来传输数据。对象管理组织(OMG)正在建议扩展接口定义语言(IDL)将XML数据类型包括进去。这样,将来CORBA产品将能传输XML数据。如图5所示:
以下的OMG IDL给出了发送者和接收者CORBA实现的接口。
exception RemoteReceiverException {
string remoteIdentifier;
string documentName;
string componentName;
string message;
string moreMessage;
};
typedef sequence<octet&g
|