敬业的IT人 >> 网站建设 >> Web编程 >> J2EE/J2ME >> J2EE Web服务客户端质量报告(三)

J2EE Web服务客户端质量报告(三)

敬业的IT人 互联网 佚名 2008-1-11 21:23:00
  • SQL2000的XML功能将现有的存储过程代
  • 用Axis开发基于Java的Web服务
  • ubuntu上的web服务配置
  • 5.1 Web服务概述
  • J2EE Web服务客户端质量报告(一)
  • 正确认识Web服务
  • 如何在鸡尾酒会上谈论Jini,J2EE和Web
  • 漫谈多态性与Web服务的结合
  • 使用 XML 通过 Java 类定义 Web服务
  • J2EE Web服务客户端质量报告(四)

  Payload软件包

  Payload软件包可用于客户端,也可用于服务器。它包含三个类:ClientReport、CurrentReport、和 Serializer。



  ClientReport 表示一个客户端次数报告:

package Payload;

import java.io.*;
import java.util.*;

/**
*
* @author Brian Connolly Brian@ideajungle.com
*/
public class ClientReport implements Serializable {

 public Date clientStartDateTime;
 public Date serverStartDateTime;
 public long clientElapsedMS;
 public String type;
 public String status;
 public String transactionID;
 public String clientID;
 //Default public constructor for WSDL
 public ClientReport() {
 }

/*
. . . Get, set property methods are not shown
*/
  在上述代码中,clientStartDateTime记录客户端初始化事务的时间。serverStartDateTime 当前没有使用;它的用途是保存事务的服务器开始时间以便事务次数可与服务器资源使用的随时间的变化关联起来。

  ClientElapsedMS是我们记录的主要工具:从客户端开始记录新事务到它收到最后一个Web服务调用的结果为止这段时间的毫秒数。

  Type允许客户端使用类型特征化事务。通常,事物系统提供许多种类型的事务。我们期望某些类型对于服务器来说相对容易一些,某些类型相对难一些,这样当我们分析响应次数和测量服务器资源时我们能够将他们辨别出来。

  Status记录事务完成时的完成状态。

  ClientID 是客户端标记符。当分析服务品质时我们可以使用它来区别同一个客户端完成的事务。

  客户端使用第二个类CurrentReport来定界应用事务:

package Payload;

import java.util.*;
import java.rmi.server.*;

/**
*
* @author Brian Connolly Brian@ideajungle.com
*/
public class CurrentReport {

 public static UID ClientIdentifier = new UID();
 /** Holds value of property currentReport */
 public static ClientReport Report;
 public static ClientReport LastReport;

 /** Creates a new instance of CurrentReport */
 public CurrentReport() {
 }

 public void BeginTransaction() {
  Report = new ClientReport();
  Report.setClientID(ClientIdentifier.toString());
  Report.setClientStartDateTime( new Date());
 }

 public void CommitTransaction(String transactionID, String type, String status) {
  Report.setTransactionID(transactionID);
  Report.setStatus(status);
  Report.setType(type);
  long l1 = Report.getClientStartDateTime().getTime();
  long l2 = new Date().getTime();
  Report.setClientElapsedMS(l2-l1);
  LastReport = Report;
  Report = null;
 }

/** Getter for property currentReport
* @return Value of property currentReport
*/

 public static ClientReport getReport() {
  ClientReport last = LastReport;
  LastReport = null;
  return last;
 }

/** Setter for property currentReport
* @param currentReport New value of property currentReport
*/

 public void setReport(ClientReport Report) {
  this.LastReport = Report;
 }
}
  CurrentReport保存进行中的事务的当前 ClientReport 。它也保存LastReport,也就是一个完成的事务。它还产生一个作为唯一设备标记符使用的客户端标记符——在实际的应用中,这个客户端标记符可被修改为全局的唯一标记符。CurrentReport是非线程安全的;我们假设在客户端应用中只有一个单线程执行服务器事务。
  • SQL2000的XML功能将现有的存储过程代
  • 用Axis开发基于Java的Web服务
  • ubuntu上的web服务配置
  • 5.1 Web服务概述
  • J2EE Web服务客户端质量报告(一)
  • 正确认识Web服务
  • 如何在鸡尾酒会上谈论Jini,J2EE和Web
  • 漫谈多态性与Web服务的结合
  • 使用 XML 通过 Java 类定义 Web服务
  • J2EE Web服务客户端质量报告(四)

  beginTransaction() 创建一个新的ClientReport,设置它的客户端标记符并且记录事务起始时间。commitTransaction() 计算事务的毫秒数并且保存最后一个调用的副本,以方便以后的到服务器的上传。

  Serializer 是Payload 软件包中的第三个类。客户端和服务器都要使用者各类。客户端使用attachPendingReportToMessage()连载待解决的当作XML的ClientReport ,并将它当作文本附件添加到SOAP信息中。服务器使用queueFirstAttachmentText()剥离信息附件并将它列队等待处理次数报告的、信息驱动的EJB组件的使用:

package Payload;

import java.io.*;
import java.util.Iterator;
import java.beans.*;
import javax.xml.rpc.handler.soap.*;
import javax.xml.soap.*;

import javax.jms.*;
import javax.naming.*;

/**
*
* @author Brian Connolly Brian@ideajungle.com
*/
public class Serializer {

 // Common queue connections used by queueFirstAttachment
 private static Context jndiContext = null;
 private static QueueConnectionFactory queueConnectionFactory = null;
 private static QueueConnection queueConnection = null;
 private static QueueSession queueSession = null;
 private static Queue queue = null;
 private static QueueSender queueSender = null;
 private static boolean connectionEstablished = false;

/** Creates a new instance of Serializer */

 public Serializer() {
 }
 private static String ClientReportXML(ClientReport r) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  XMLEncoder sstream = new XMLEncoder(baos);

  sstream.writeObject(r);
  sstream.flush();
  sstream.close();
  return baos.toString();
 }

 public static ClientReport ClientReportXML(String crXML) {
  ByteArrayInputStream bais = new ByteArrayInputStream(crXML.getBytes());
  XMLDecoder sstream = new XMLDecoder(bais);

  return (ClientReport)sstream.readObject();
 }

 public static void attachPendingReportToMessage(SOAPMessageContext smc) {
  try{
   ClientReport cr = CurrentReport.getReport();
   if (cr != null) {
    SOAPMessage mc = smc.getMessage();
    AttachmentPart ap = mc.createAttachmentPart(Serializer.ClientReportXML(cr),new String("text/plain"));
    mc.addAttachmentPart(ap);
   }
  }
  catch(Exception e){
   // Make sure that application processing proceeds undisturbed
  }
 }
 
 public static void queueFirstAttachmentText(SOAPMessageContext smc) {
  String sattachment;
  try{
   SOAPMessage mc = smc.getMessage();
   Iterator attachments = mc.getAttachments();
   if(attachments.hasNext()){
    AttachmentPart attachment = (AttachmentPart)attachments.next();
    sattachment = attachment.getContent().toString();
    attachments.remove();
    queueReportXML(sattachment);
   }
  }
  catch (SOAPException e){
   System.out.println("Queue Attachment exception:" + e.toString());
  }
 }

/*
Synchronized because all callers share the queue resources
*/

 public static synchronized void queueReportXML(String clientReportXML) {
  TextMessage message = null;
  if (!connectionEstablished) {
   try{
    jndiContext = new InitialContext();
    queueConnectionFactory = (QueueConnectionFactory) jndiContext.lookup(
"jms/TestMDBFactory");
    System.out.println("have factory");
    queue = (Queue) jndiContext.lookup("jms/TestMDBQueue");

    queueConnection = queueConnectionFactory.createQueueConnection();
    queueSession = queueConnection.createQueueSession (false, Session.AUTO_ACKNOWLEDGE);
queueSender = queueSession.createSender(queue);
    connectionEstablished = true;
   }
   catch (Exception e){
    System.out.println("Exception occurred connecting to queue: "+ e.toSt ring());
   }
  }
  try {
   message = queueSession.createTextMessage();
   message.setText(clientReportXML);
   //System.out.println("Sending message: " + (String)message.getText());
queueSender.send(message);
  } catch (JMSException e) {
   System.out.println("Exception occurred: " + e.toString());
  } catch (Exception e){
 // Make sure that application processing proceeds undisturbed
 }
}

}


  注意:queueReportXML()是同步的。因为Serializer类保存一个单一的静态队列连接,我们必须保证在一段时间内只有一个执行线程使用该连接。

  注意:该实现假设它自己是HTTP/SOAP信息附件的唯一创建者和使用者。如果一个实现将附件用作其他用途,类Serializer 需要修改以便标志和检索包含信息报告的特殊附件。

  我们使用该结构的目的之一是保证次数报告处理失败不影响商业应用的完成。Serializer 软件包暴露的每个方法捕捉产生的任何异常,以便事务的处理可以不管这些异常继续进行。引用:
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com