http://127.0.0.1:8080/jbossws/services 查看webservice的发布情况
----------------------------------------------------------------------------
二,新建客户端项目。
1,这里我们借用axis-bin-1_4.zip里的
samples.client.DynamicInvoker类来充当WebService客户端。
记得项目导入axis依赖包。
package samples.client; import org.apache.axis.Constants;
import org.apache.axis.utils.XMLUtils;
import org.apache.axis.encoding.ser.SimpleDeserializer;
import org.apache.axis.encoding.ser.ElementSerializerFactory;
import org.apache.axis.encoding.ser.ElementDeserializerFactory;
import org.apache.axis.encoding.ser.ElementDeserializer;
import org.apache.axis.wsdl.gen.Parser;
import org.apache.axis.wsdl.symbolTable.BaseType;
import org.apache.axis.wsdl.symbolTable.BindingEntry;
import org.apache.axis.wsdl.symbolTable.Parameter;
import org.apache.axis.wsdl.symbolTable.Parameters;
import org.apache.axis.wsdl.symbolTable.ServiceEntry;
import org.apache.axis.wsdl.symbolTable.SymTabEntry;
import org.apache.axis.wsdl.symbolTable.SymbolTable;
import org.apache.axis.wsdl.symbolTable.TypeEntry;
import org.w3c.dom.Element; import javax.wsdl.Binding;
import javax.wsdl.Operation;
import javax.wsdl.Port;
import javax.wsdl.Service;
import javax.wsdl.extensions.soap.SOAPAddress;
import javax.xml.namespace.QName;
import javax.xml.rpc.Call;
import javax.xml.rpc.encoding.Deserializer;
import javax.xml.rpc.encoding.DeserializerFactory;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
public class DynamicInvoker { private Parser wsdlParser = null; public DynamicInvoker(String wsdlURL) throws Exception {
// Start by reading in the WSDL using Parser
wsdlParser = new Parser();
System.out.println("Reading WSDL document from '" + wsdlURL + "'");
wsdlParser.run(wsdlURL);
} private static void usage() {
System.err.println(
"Usage: java " + DynamicInvoker.class.getName() + " wsdlLocation "
+ "operationName[(portName)] "
+ "[argument1 ...]");
System.exit(1);
} public static void main(String[] args) throws Exception {
if (args.length < 2) {
usage();
}
String wsdlLocation = (args.length > 0)
? args[0]
: null;
String operationName = (args.length > 1)
? args[1]
: null;
String portName = null;
try {
portName = operationName.substring(operationName.indexOf("(") + 1,
operationName.indexOf(")"));
operationName = operationName.substring(0, operationName.indexOf("("));
} catch (Exception ignored) {
} DynamicInvoker invoker = new DynamicInvoker(wsdlLocation);
HashMap map = invoker.invokeMethod(operationName, portName, args); for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
String key = (String) entry.getKey();
Object value = entry.getValue();
if (value instanceof Element) {
System.out.println("====== " + key + " ======");
XMLUtils.ElementToStream((Element) value, System.out);
System.out.println("=========================");
} else {
System.out.println(key + "=" + value);
}
}
System.out.println("\nDone!");
} public HashMap invokeMethod(
String operationName, String portName, String[] args)
throws Exception {
String serviceNS = null;
String serviceName = null;
String operationQName = null; System.out.println("Preparing Axis dynamic invocation");
Service service = selectService(serviceNS, serviceName);
Operation operation = null;
org.apache.axis.client.Service dpf = new org.apache.axis.client.Service(wsdlParser, service.getQName()); Vector inputs = new Vector();
Port port = selectPort(service.getPorts(), portName);
if (portName == null) {
portName = port.getName();
}
Binding binding = port.getBinding();
Call call = dpf.createCall(QName.valueOf(portName),
QName.valueOf(operationName));
((org.apache.axis.client.Call)call).setTimeout(new Integer(15*1000));
((org.apache.axis.client.Call)call).setProperty(ElementDeserializer.DESERIALIZE_CURRENT_ELEMENT, Boolean.TRUE);
// Output types and names
Vector outNames = new Vector(); // Input types and names
Vector inNames = new Vector();
Vector inTypes = new Vector();
SymbolTable symbolTable = wsdlParser.getSymbolTable();
BindingEntry bEntry =
symbolTable.getBindingEntry(binding.getQName());
Parameters parameters = null;
Iterator i = bEntry.getParameters().keySet().iterator(); while (i.hasNext()) {
Operation o = (Operation) i.next();
if (o.getName().equals(operationName)) {
operation = o;
parameters = (Parameters) bEntry.getParameters().get(o);
break;
}
}
if ((operation == null) || (parameters == null)) {
throw new RuntimeException(operationName + " was not found.");
} // loop over paramters and set up in/out params
for (int j = 0; j < parameters.list.size(); ++j) {
Parameter p = (Parameter) parameters.list.get(j); if (p.getMode() == 1) { // IN
inNames.add(p.getQName().getLocalPart());
inTypes.add(p);
} else if (p.getMode() == 2) { // OUT
outNames.add(p.getQName().getLocalPart());
} else if (p.getMode() == 3) { // INOUT
inNames.add(p.getQName().getLocalPart());
inTypes.add(p);
outNames.add(p.getQName().getLocalPart());
}
} // set output type
if (parameters.returnParam != null) { if(!parameters.returnParam.getType().isBaseType()) {
((org.apache.axis.client.Call)call).registerTypeMapping(org.w3c.dom.Element.class, parameters.returnParam.getType().getQName(),
new ElementSerializerFactory(),
new ElementDeserializerFactory());
} // Get the QName for the return Type
QName returnType = org.apache.axis.wsdl.toJava.Utils.getXSIType(
parameters.returnParam);
QName returnQName = parameters.returnParam.getQName(); outNames.add(returnQName.getLocalPart());
} if (inNames.size() != args.length - 2)
throw new RuntimeException("Need " + inNames.size() + " arguments!!!"); for (int pos = 0; pos < inNames.size(); ++pos) {
String arg = args[pos + 2];
Parameter p = (Parameter) inTypes.get(pos);
inputs.add(getParamData((org.apache.axis.client.Call) call, p, arg));
}
System.out.println("Executing operation " + operationName + " with parameters:");
for (int j = 0; j < inputs.size(); j++) {
System.out.println(inNames.get(j) + "=" + inputs.get(j));
}
Object ret = call.invoke(inputs.toArray());
Map outputs = call.getOutputParams();
HashMap map = new HashMap(); for (int pos = 0; pos < outNames.size(); ++pos) {
String name = (String) outNames.get(pos);
Object value = outputs.get(name); if ((value == null) && (pos == 0)) {
map.put(name, ret);
} else {
map.put(name, value);
}
}
return map;
} private Object getParamData(org.apache.axis.client.Call c, Parameter p, String arg) throws Exception {
// Get the QName representing the parameter type
QName paramType = org.apache.axis.wsdl.toJava.Utils.getXSIType(p); TypeEntry type = p.getType();
if (type instanceof BaseType && ((BaseType) type).isBaseType()) {
DeserializerFactory factory = c.getTypeMapping().getDeserializer(paramType);
Deserializer deserializer = factory.getDeserializerAs(Constants.AXIS_SAX);
if (deserializer instanceof SimpleDeserializer) {
return ((SimpleDeserializer)deserializer).makeValue(arg);
}
}
throw new RuntimeException("not know how to convert '" + arg
+ "' into " + c);
} public Service selectService(String serviceNS, String serviceName)
throws Exception {
QName serviceQName = (((serviceNS != null)
&& (serviceName != null))
? new QName(serviceNS, serviceName)
: null);
ServiceEntry serviceEntry = (ServiceEntry) getSymTabEntry(serviceQName,
ServiceEntry.class);
return serviceEntry.getService();
} public SymTabEntry getSymTabEntry(QName qname, Class cls) {
HashMap map = wsdlParser.getSymbolTable().getHashMap();
Iterator iterator = map.entrySet().iterator(); while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
QName key = (QName) entry.getKey();
Vector v = (Vector) entry.getValue(); if ((qname == null) || qname.equals(qname)) {
for (int i = 0; i < v.size(); ++i) {
SymTabEntry symTabEntry = (SymTabEntry) v.elementAt(i); if (cls.isInstance(symTabEntry)) {
return symTabEntry;
}
}
}
}
return null;
} public Port selectPort(Map ports, String portName) throws Exception {
Iterator valueIterator = ports.keySet().iterator();
while (valueIterator.hasNext()) {
String name = (String) valueIterator.next(); if ((portName == null) || (portName.length() == 0)) {
Port port = (Port) ports.get(name);
List list = port.getExtensibilityElements(); for (int i = 0; (list != null) && (i < list.size()); i++) {
Object obj = list.get(i);
if (obj instanceof SOAPAddress) {
return port;
}
}
} else if ((name != null) && name.equals(portName)) {
return (Port) ports.get(name);
}
}
return null;
}
}
2,运行samples.client.DynamicInvoker类。
运行时需要在open run dialog配置三个参数。
在arguments标签中输入
http://localhost:8080/firstEjb/HelloBean?wsdl saySomething hxzon
运行成功。
可看到控制台输出
Reading WSDL document from 'http://localhost:8080/firstEjb/HelloBean?wsdl'
Preparing Axis dynamic invocation
Executing operation saySomething with parameters:
saySomething>arg0=hxzon
saySomethingResponse>return=hello,hxzon Done! ============================================================
============================================================
wsdl文件,该文件自动生成。
xmlns='http://schemas.xmlsoap.org/wsdl/'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:tns='http://hxzon/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
xmlns:tns='http://hxzon/'
xmlns:xs='http://www.w3.org/2001/XMLSchema'>
type='tns:saySomethingResponse' />
type='xs:string' />
type='xs:string' />
name='saySomethingResponse'>
transport='http://schemas.xmlsoap.org/soap/http' />
location='http://127.0.0.1:8080/firstEjb/HelloBean' />
===================================================
===================================================
消息bean简单例子 -ejbcode -hxzon 一,新建Ejb项目。
实现MessageListener接口,添加@MessageDriven注解。
package hxzon; import javax.ejb.MessageDriven;
import javax.ejb.ActivationConfigProperty;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage; @MessageDriven(
activationConfig={
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/myqueue")
}
) public class HelloMDB implements MessageListener{ public void onMessage(Message msg) {
TextMessage tmsg=(TextMessage)msg;
try {
System.out.println("已接收消息。。。"+tmsg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
} }
二,新建客户端项目。
package hxzon; import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.InitialContext; public class MDBClient { public static void main(String[] args) {
try {
InitialContext ctx=new InitialContext();
QueueConnectionFactory factory=(QueueConnectionFactory)ctx.lookup("ConnectionFactory");
QueueConnection con=factory.createQueueConnection();
QueueSession session=con.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Queue queue=(Queue)ctx.lookup("queue/myqueue");
TextMessage msg=session.createTextMessage("hello,hxzon");
QueueSender sender=session.createSender(queue);
sender.send(msg);
session.close();
System.out.println("已发送消息");
} catch (Exception e) {
e.printStackTrace();
} } }
运行成功。
上述是点到点模型,也可使用发布-预定模型。只需将Queue改为Topic即可。QueueSender改为TopicPublisher,调用publish(msg)方法。
----------------------------------------------------------------------------
package hxzon; import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage; @MessageDriven(
activationConfig={
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Topic"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="topic/mytopic")
}
)
public class HelloTopicMDB implements MessageListener { public void onMessage(Message msg) {
TextMessage tmsg=(TextMessage)msg;
try {
System.out.println("已接收消息。。。"+tmsg.getText());
} catch (JMSException e) {
e.printStackTrace();
} } }
----------------------------------------------------------------------
package hxzon; import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.InitialContext; public class TopicMDBClient {
public static void main(String[] args) {
try {
InitialContext ctx=new InitialContext();
TopicConnectionFactory factory=(TopicConnectionFactory)ctx.lookup("ConnectionFactory");
TopicConnection con=factory.createTopicConnection();
TopicSession session=con.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
Topic topic=(Topic)ctx.lookup("topic/mytopic");
TextMessage msg=session.createTextMessage("hello,hxzon");
TopicPublisher publisher=session.createPublisher(topic);
publisher.publish(msg);
session.close();
System.out.println("已发送消息");
} catch (Exception e) {
e.printStackTrace();
} } }