jboss ESB 是企业服务总线,应用很广,但资料很少,而且仅有的很少的资料都是英文的。
最近研究了一下jboss esb的服务编排,直接进入主题了。
jboss ESB 的环境配置这里就不说了,jboss的服务编排要建三个项目
(1)jbpm的项目(编排服务的流转顺序,这里使用的是jbpm3)
(2)建一个web项目,提供webservice服务。
(3)建一个esb服务,作为企业服务总线使用。
一 建 jbpm项目,然后建一个流程实例
如图所示的流程实例,有一个开始节点、两个esb service 节点 、一个任务节点和一个结束节点
a 打开esb service节点的属性页面,编辑服务的名称,类别,输入、输出参数(这里的服务名称、类别、输入输出参数将和esb中的对应)
二 建一个动态的web项目,作为webservice服务使用。
这里使用
cxf 提供的建立webservice的方法
1 webservice_1
package com.richfit.jbpmwebservice;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService
public class WebService_1java {
@WebMethod(operationName = "process")
public String process_1(@WebParam(name = "xml") String xml) {
System.out
.println("------------------start process_1--------------------");
System.out.println(xml);
System.out
.println("------------------start process_1--------------------");
return "webservice_1:" + xml;
}
}
2 webservice_2
package com.richfit.jbpmwebservice;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService
public class WebService_2java {
@WebMethod(operationName = "process")
public String process_1(@WebParam(name = "xml") String xml) {
System.out
.println("------------------start process_2--------------------");
System.out.println(xml);
System.out
.println("------------------start process_2--------------------");
return "webservice_1:" + xml;
}
}
三 建立esb服务
ProcessWebServiceParam 类
package com.richfit.jbpm;
import java.util.HashMap;
import java.util.Map;
import org.jboss.soa.esb.actions.AbstractActionLifecycle;
import org.jboss.soa.esb.actions.ActionProcessingException;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.message.Message;
public class ProcessWebServiceParam extends AbstractActionLifecycle{
public ProcessWebServiceParam(ConfigTree _tree) {
}
public Message processParam(Message msg) throws ActionProcessingException {
String order = (String)msg.getBody().get("xml");
Map map = new HashMap();
map.put("process.xml", order);
msg.getBody().add("xml",map);
return msg;
}
public Message processReturn(Message msg) throws ActionProcessingException {
Map order = (Map)msg.getBody().get("return");
msg.getBody().add("xml",order.get("processResponse.return"));
return msg;
}
}
jbm-queue-service.xml 文件 (为provider提供队列)
name="jboss.esb.demo.destination:service=Queue,name=bpmstart"
xmbean-dd="xmdesc/Queue-xmbean.xml">
jboss.messaging:service=ServerPeer
jboss.messaging:service=PostOffice
jboss-esb.xml 文件 (esb的主要文件,配置服务、action,provider 等信息)
xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.2.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.2.0.xsd http://anonsvn.jboss.org/repos/labs/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.2.0.xsd">
name="jboss message">
dest-type="QUEUE" />
name="webservice_1">
process="processParam" />
name="webservice_1">
value="http://127.0.0.1:8080/jbpmtest/webservice_1?wsdl" />
process="processReturn" />
name="webservice_2">
process="processParam" />
name="webservice_2">
value="http://127.0.0.1:8080/jbpmtest/webservice_2?wsdl" />
process="processReturn" />
(这里是对jbpm的引用)
class="org.jboss.soa.esb.services.jbpm.actions.BpmProcessor">
deployment.xml文件,发布服务的描叙文件
name="jboss.esb.demo.destination:service=Queue,name=bpmstart"
xmbean-dd="xmdesc/Queue-xmbean.xml">
jboss.messaging:service=ServerPeer
jboss.messaging:service=PostOffice
到这里,所有的信息都建立完毕。
然后发布服务和流程实例,注意这里的服务器使用的是jboss
建立客户端测试,esb的服务编排是否成功
所需的jar包如上图所示。
客户端的目录说明,
SimpleWebServiceEsbClient 类信息
package org.jboss.simple.esbclient;
import org.jboss.soa.esb.client.ServiceInvoker;
import org.jboss.soa.esb.couriers.FaultMessageException;
import org.jboss.soa.esb.listeners.message.MessageDeliverException;
import org.jboss.soa.esb.message.Message;
import org.jboss.soa.esb.message.format.MessageFactory;
import org.jboss.soa.esb.services.registry.RegistryException;
public class SimpleWebServiceEsbClient {
/**
* @param args
* @throws RegistryException
* @throws MessageDeliverException
* @throws FaultMessageException
*/
public static void main(String[] args) throws FaultMessageException,
MessageDeliverException, RegistryException {
System.setProperty("javax.xml.registry.ConnectionFactoryClass",
"org.apache.ws.scout.registry.ConnectionFactoryImpl");
// System.setProperty("org.jboss.soa.esb.propertyFile",
// "abs://D:/jbossesb-properties.xml");
Message esbMessage = MessageFactory.getInstance().getMessage();
// Map map = new HashMap();
// map.put("hello.username", "jboss soa");
esbMessage.getBody().add("simplewebservice");
new ServiceInvoker("jbpm", "bpmstart").deliverAsync(esbMessage);
}
}
uudi.xml文件
3600000
default
Main jUDDI node
org.apache.juddi.v3.client.transport.JAXWSTransport
http://localhost:8080/juddiv3/services/custody-transfer?wsdl
http://localhost:8080/juddiv3/services/inquiry?wsdl
http://localhost:8080/juddiv3/services/publish?wsdl
http://localhost:8080/juddiv3/services/security?wsdl
http://localhost:8080/juddiv3/services/subscription?wsdl
http://localhost:8080/juddiv3/services/subscription-listener?wsdl
http://localhost:8080/juddiv3/services/juddi-api?wsdl
default-ws
jUDDI console node
org.jboss.internal.soa.esb.registry.client.JuddiInVMTransport
org.apache.juddi.api.impl.UDDICustodyTransferImpl
org.apache.juddi.api.impl.UDDIInquiryImpl
org.apache.juddi.api.impl.UDDIPublicationImpl
org.apache.juddi.api.impl.UDDISecurityImpl
org.apache.juddi.api.impl.UDDISubscriptionImpl
org.apache.juddi.api.impl.UDDISubscriptionListenerImpl
org.apache.juddi.api.impl.JUDDIApiImpl
jbossesb-properties.xml 文件
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="jbossesb-1_0.xsd">
如果控制台打印出了webservice总输出的信息,说明服务编排成功。还可以从jboss的控制台查看流程实例的节点是否运行到了end节点