官方文档如下:
http://staf.sourceforge.net/current/staxdg.html#Header_reg
关于官方文档,这里有几个坑要注意:
编译STAX扩展的教程在最后面,而交你写的Delay却在前面。
创建一个Jar文件在编译的后面。
到目前为止,学了2个多月,3个月不到的java把这个官方例子跑起来了,花了2天时间,不容易啊。
首先进行编译,按照要求把CLASSPATH配好。配置要求如下:
这里的
set STAXDevDir=C:\STAXDev
set STAFDir=C:\STAF
set STAXCLASSES=%STAXDevDir%\STAF-INF\classes
set JSTAFJAR=%STAFDir%\lib\JSTAF.jar
set STAXJARDIR=%STAXDevDir%\STAF-INF\jars
REM set STAXJARDIR=%STAFDir%\data\STAF\lang\java\service\STAX\jars
set STAXJARFILES=%STAXJARDIR%\xercesImpl.jar;%STAXJARDIR%\xmlParserAPIs.jar;%STAXJARDIR%\jython.jar
set STAXMONJAR=%STAFDir%\services\STAXMon.jar
set CLASSPATH=%JSTAFJAR%;%STAXCLASSES%;%STAXJARFILES%;%STAXMONJAR%;
我也不知道该怎么配,但不要紧,为什么呢?因为后面生成jar文件的时候,只需要有Class文件就可以了。
所以把eclipse配置好。运行下,然后打包成jar包。
eclipse配置如下:
这里有一些重复的jar包,因为是我在研究eclipse添加jar包和CLASSPATH之间的关系时重复操作了,大家可以忽略。
点一下run后,导出jar包,但会有如下的情况:
有警告!!!!但没关系,我们看下这个jar包,
有Class文件,这下就好了。直接解压,然后按照
这个进行配置,但可以发现ExtDelay$1.class这个类中类竟然木有,这是一个天坑。
现在看下ExtDelay.java这个文件:
/*****************************************************************************/
/* Software Testing Automation Framework (STAF) */
/* (C) Copyright IBM Corp. 2002 */
/* */
/* This software is licensed under the Eclipse Public License (EPL) V1.0. */
/*****************************************************************************/
package com.ibm.staf.service.stax.extension.samples.extdelay;
import javax.swing.*;
import javax.swing.event.*;
import com.ibm.staf.*;
import java.util.*;
import java.awt.*;
import java.lang.reflect.*;
import com.ibm.staf.service.stax.*;
public class ExtDelay implements STAXMonitorExtension
{
STAFHandle fHandle;
String fLocalMachine;
String fStaxMachine;
String fStaxServiceName;
String fJobNumber;
STAXMonitorFrame fMonitorFrame;
String fTitle;
HashMap fProgressBarMap;
boolean fContinueElapsedTime = true;
Hashtable fMonitorDelayStartTimes = new Hashtable();
Hashtable fMonitorDelayTimeLabels = new Hashtable();
MonitorElapsedTime fElapsedTime;
private ImageIcon delayIcon;
public JComponent init(STAXMonitorFrame monitorFrame, boolean newJob,
String staxMachineName,
String staxServiceName, String jobNumber)
throws STAFException
{
fMonitorFrame = monitorFrame;
fStaxMachine = staxMachineName;
fStaxServiceName = staxServiceName;
fJobNumber = jobNumber;
fTitle = "Delay text";
Class c = this.getClass();
ClassLoader classLoader = c.getClassLoader();
delayIcon = ((STAXMonitorExtensionClassLoader)classLoader).
getImage("delay.gif");
fProgressBarMap = new HashMap();
fElapsedTime = new MonitorElapsedTime();
fElapsedTime.start();
return new JPanel();
}
public String getNotificationEventTypes()
{
return "ext-delay";
}
public void term() {}
public String getTitle()
{
return fTitle;
}
public int getExtensionType()
{
return STAXMonitorFrame.EXTENSION_ACTIVE_JOB_ELEMENTS;
}
public JComponent getComponent()
{
return new JPanel();
}
public void handleEvent(Map map)
{
String status = (String)map.get("status");
String block = (String)map.get("block");
String id = (String)map.get("name");
if (status.equals("start"))
{
String delay = (String)map.get("delay");
Vector delayDataVector = new Vector();
addRow(delayDataVector, "Delay Value", delay);
JProgressBar progressBar = new JProgressBar();
progressBar.setMaximum((new Integer(delay)).intValue());
progressBar.setStringPainted(true);
Dimension dim = progressBar.getPreferredSize();
dim.height = 20;
progressBar.setPreferredSize(dim);
synchronized(fProgressBarMap)
{
fProgressBarMap.put(id, progressBar);
}
JLabel elapsedTimeLabel = new JLabel();
elapsedTimeLabel.setFont(new Font("Dialog", Font.PLAIN, 12));
JPanel extPanel = new JPanel();
extPanel.setLayout(new BorderLayout());
extPanel.setBackground(Color.white);
extPanel.add(BorderLayout.CENTER, progressBar);
extPanel.add(BorderLayout.EAST, elapsedTimeLabel);
fMonitorFrame.addActiveJobElementsNode("delay", id,
block, id, delayIcon, extPanel, delayDataVector);
synchronized(fMonitorDelayStartTimes)
{
fMonitorDelayStartTimes.put(id, Calendar.getInstance());
}
synchronized(fMonitorDelayTimeLabels)
{
fMonitorDelayTimeLabels.put(id, elapsedTimeLabel);
}
}
else if (status.equals("stop"))
{
synchronized(fProgressBarMap)
{
fProgressBarMap.remove(id);
}
synchronized(fMonitorDelayStartTimes)
{
fMonitorDelayStartTimes.remove(id);
}
synchronized(fMonitorDelayTimeLabels)
{
fMonitorDelayTimeLabels.remove(id);
}
fMonitorFrame.removeActiveJobElementsNode(id, block);
}
else if (status.equals("iterate"))
{
String delay = (String)map.get("delay");
String currentIter = (String)map.get("currentiter");
Integer delayInt = new Integer(delay);
final Integer currentIterInt = new Integer(currentIter);
float delayFloat = (float)(delayInt.intValue());
float currentIterFloat = (float)(currentIterInt.intValue());
int percent = (int)((currentIterFloat / delayFloat * 100));
final JProgressBar progressBar =
(JProgressBar)fProgressBarMap.get(id);
progressBar.setValue(currentIterInt.intValue());
fMonitorFrame.setActiveJobElementsNodeText(id, id +
" " + (new Integer(percent).toString()) + "% complete");
}
}
public void addRow(Vector vector, String name, String value)
{
Vector newRow = new Vector(2);
newRow.add(name);
newRow.add(value);
vector.add(newRow);
}
class MonitorElapsedTime extends Thread
{
public void run()
{
final int waitTime = fMonitorFrame.getElapsedTimeInterval();
if (waitTime == 0)
return;
while (fContinueElapsedTime)
{
final Enumeration delayElapsedTimeKeys =
fMonitorDelayStartTimes.keys();
Runnable delayRunnable = new Runnable()
{
public void run()
{
while (fContinueElapsedTime &&
delayElapsedTimeKeys.hasMoreElements())
{
String delayKey =
(String)delayElapsedTimeKeys.nextElement();
Calendar delayStarted = (Calendar)
fMonitorDelayStartTimes.get(delayKey);
synchronized(fMonitorDelayTimeLabels)
{
JLabel elapsedTimeLabel = (JLabel)
fMonitorDelayTimeLabels.get(delayKey);
elapsedTimeLabel.setText(" (" + STAXMonitorUtil.
getElapsedTime(delayStarted) + ")");
}
}
}
};
try
{
SwingUtilities.invokeAndWait(delayRunnable);
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
catch (InvocationTargetException ex)
{
ex.printStackTrace();
}
try
{
Thread.sleep(waitTime);
}
catch (InterruptedException ex)
{
}
}
}
}
}
发现的确有个MonitorElapsedTime类。
文档上是ExtDelay$1.class,但生成的jar却是ExtDelay$MonitorElapsedTime$1.class。
这是个天坑,直接修改文件
这里要注意:要把这个文件下载下来,这里面有gif和mf,不用自己去操作了
然后打包放到他要求的目录,再进打包,然后浏览
然后打包放到他要求的目录,再进打包,然后浏览
如下图所示:
现在把文件直接拷贝到服务目录:
然后在这里随便选一个对stf.cfg进行修改:(这个文件是staxug.pdf,是从官方文档上下载的)
本人的配置如下:
随后启动:staf。发现没有java的异常输出。如下图所示:
更具这个(也是staxug.pdf里面的)
配置调用的xml文件,上面是文档上面的,下面是完整的写好的:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "stax.dtd">
<stax>
<defaultcall function="main"/>
<function name="main">
<stafcmd name="'Delay'">
<location>'local'</location>
<service>'delay'</service>
<request>'delay 5000'</request>
</stafcmd>
</function>
</stax>
接下来运行,运行截图如下:
延迟5s然后没了