J2EE Web处事客户端质量陈诉(四)
副标题#e#
客户端处事软件包
通过指引WSDL编译器到应用处事器提供的WSDL上可自动生成客户端处事软件包。这个软件包包括很多类。我们需要修改的独一类就是客户端Stub类。同样地,处事器Web 处事软件包也包括类Tie,它可将Web处事请求绑定到EJB要领上,客户端Stub类为每个处事贸易要领的每个客户端配备一个要领。
处事Stub类的名称为 <ServiceName>ServantInterface_Stub,个中<ServiceName>就是处事名。我们看看类XactServiceServantInterface_Stub 内的submitWork()要领:
/*
* Implementation of submitWork
*/
public java.lang.String submitWork(java.lang.String string_1)
throws java.rmi.RemoteException {
try {
StreamingSenderState _state = _start(_handlerChain);
InternalSOAPMessage _request = _state.getRequest();
_request.setOperationCode(SubmitWork_OPCODE);
Xact.XactServiceServantInterface_SubmitWork_RequestStruct
_myXactServiceServantInterface_SubmitWork_RequestStruct =new Xact.XactServiceServantInterface_SubmitWork_RequestStruct();
_myXactServiceServantInterface_SubmitWork_RequestStruct.setString_1(string_1);
SOAPBlockInfo _bodyBlock = new SOAPBlockInfo(ns1_SubmitWork_SubmitWork_QNAME);
_bodyBlock.setValue(_myXactServiceServantInterface_SubmitWork_RequestStruct);
_bodyBlock.setSerializer(myXactServiceServantInterface_SubmitWork_RequestStruct_SOAPSerializer);
_request.setBody(_bodyBlock);
_state.getMessageContext().setProperty(HttpClientTransport.HTTP_SOAPACTION_PROPERTY, "");
Serializer.attachPendingReportToMessage(_state.getMessageContext());
_send((String) _getProperty(ENDPOINT_ADDRESS_PROPERTY), _state);
Xact.XactServiceServantInterface_SubmitWork_ResponseStruct
_myXactServiceServantInterface_SubmitWork_ResponseStruct = null;
Object _responseObj = _state.getResponse().getBody().getValue();
if (_responseObj instanceof SOAPDeserializationState) {
_myXactServiceServantInterface_SubmitWork_ResponseStruct =
(Xact.XactServiceServantInterface_SubmitWork_ResponseStruct)
((SOAPDeserializationState)_responseObj).getInstance();
} else {
_myXactServiceServantInterface_SubmitWork_ResponseStruct =(Xact.XactServiceServantInterface_SubmitWork_ResponseStruct)responseObj;
}
return _myXactServiceServantInterface_SubmitWork_ResponseStruct
.getResult();
} catch (RemoteException e) {
// Let this one through unchanged
throw e;
} catch (JAXRPCException e) {
throw new RemoteException(e.getMessage(), e);
} catch (Exception e) {
if (e instanceof RuntimeException) {
throw (RuntimeException)e;
} else {
throw new RemoteException(e.getMessage(), e);
}
}
}
在上述的代码中,我们在_send()之前当即添加了下面的单行:
Serializer.attachPendingReportToMessage(_state.getMessageContext());
假如没有待办理的客户端陈诉需要发送,attachPendingReportToMessage 就返回。不然,它将当前陈诉连在XML之后并将它看成文本附件添加到SOAP信息中。我们对其他的贸易要领也作了同样的修改,在它们的每个_send()挪用之前当即添加了上面的代码行。
#p#副标题#e#
信息驱动的 bean
此刻我们可以记录客户端事务响应次数并将它们通过HTTP/SOAP的运输,我们需要一条可以在应用处事器上处理惩罚这些陈诉的要领。最适合完成这个任务的就是信息驱动的EJB组件因为响应次数陈诉应该异步地搬运到用户事务上。Web 处事类 Tie将XML ClientReport工具排队。下面的EJB代码可读取和处理惩罚这些陈诉:
package TestBean;
import javax.jms.*;
import javax.ejb.*;
import Payload.*;
/**
* Created May 23, 2003 6:01:04 PM
* Code generated by the Sun ONE Studio EJB Builder
* @author Brian
*/
public class TestMDBBean implements
javax.ejb.MessageDrivenBean, javax.jms.MessageListener {
private transient javax.ejb.MessageDrivenContext context;
/**
* @see javax.ejb.MessageDrivenBean
#setMessageDrivenContext
(javax.ejb.MessageDrivenContext)
*/
public void setMessageDrivenContext
(javax.ejb.MessageDrivenContext aContext) {
context=aContext;
}
/**
* See section 15.4.4 of the EJB 2.0 specification
*/
public void ejbCreate() {
}
/**
* @see javax.jms.MessageListener#onMessage(javax.jms.Message)
*/
public void onMessage(javax.jms.Message aMessage) {
TextMessage msg = null;
try {
if (aMessage instanceof TextMessage) {
msg = (TextMessage) aMessage;
String crXML = msg.getText();
//System.out.println("MESSAGE BEAN: Message");
//System.out.println(crXML);
ClientReport cr = Serializer.ClientReportXML(crXML);
System.out.println
("Took:" + String.valueOf(cr.getClientElapsedMS()) +
" MS. for: " + cr.getType().toString());
} else {
System.out.println("Message of wrong type: " +
aMessage.getClass().getName());
}
} catch (JMSException e) {
System.err.println("MessageBean.onMessage: " +
"JMSException: " + e.toString());
context.setRollbackOnly();
} catch (Throwable te) {
System.err.println("MessageBean.onMessage: " +
"Exception: " + te.toString());
}
}
/**
* @see javax.ejb.MessageDrivenBean#ejbRemove()
*/
public void ejbRemove() {
}
}
#p#分页标题#e#
凡是,陈诉会挂号到数据库顶用于在线阐明和陈诉。在本例中,我们将陈诉打印到节制台以便演示客户端如何吸收它们的进程。要领 onMessage()利用Serializer.ClientReportXML() 建设来自排队期待的XML字符串的ClientReport工具。我们在这里做一下解码事情以便可以将处理惩罚次数生存在事务处理惩罚事情流程中。
样品实现
用来运行样品应用的所有代码都可从Resources处下载。我开拓代码时利用的东西是Sun ONE Studio, Enterprise Edition Update 1。 这个东西箱包罗一个J2EE开拓IDE 和一个J2EE应用处事,它的Web 处事设备回收了嵌入式的Java Web Service Developer Pack 1.0_01。 Resources 处有自由下载URL的信息和到开拓者文档的链接。
成立和设置处事器应用
这部门假设你已经相识Sun ONE 应用框架的应用常识。别的,本指示假设你利用微软的Windows系统。设置的完整源代码预先已经成立。Web处事客户端和处事器软件包已经生成(并为了次数陈诉的持续化做好修改),可是下面的描写也包括了关于如安在Sun ONE IDE之内成立组件的一些配景常识。
要成立和设置处事器应用,首先,在Windows 开始菜单中选择措施,再在措施中选择Sun Microsystems,然后依次选择Sun ONE Application Server和 Start Application Server项。
实用雷同的Windows 呼吁可启动IDE。右击资源打点器中的“运行”键,点击安装的处事器,并担保应用处事的运行实例已经配置为默认处事器。
解压下载的东西包到某个目次下并右击IDE资源打点器窗口的文件系统图标。利用Mount/Local Directory 对话框,实现两个差异的安装呼吁:
<download directory>/Metrics/Metrics 打开Payload软件包。
<download directory>/Metrics/TransactionServer 打开处事器EJB、 Web 模块、和处事器应用组件。
EJBModule_Xact 为应用处事原型,它包罗三个贸易要领:submitWork()、 checkWork()、和getResult()。要建设同一目次下的TransactionProcessor/Xact_Module可右击 EJB 然后依次选择New、JSP & Servlet、和Web Module呼吁。建设TransactionService软件包中的Web 模块可依次选择New、Web Services、和 Web Module 领导,然后选择EJB组件的Java要领作为源措施。右击Web Module并选择Create New Web Service项可自动建设TransactionService/XactServiceGenServer。可是在右击之前请小心,因为它会封锁添加到类Tie上的Serialize 挪用。
建设应用措施TransactionServerApp 需要依次选择New、J2EE、和Application呼吁。 右击空的应用,选择Add Modules 项,然后选择EJBModule_Xact 和Xact_Service Web Module项就可添加组件到应用措施上。
本部门给出了如何成立代码组件的一般思想。你需要将这些组件设置到你的应用处事上。在IDE之内,右击TransactionServerApp即可举办设置。查抄一下应用处事系统节制台以担保它的设置正确。