我听说许多人(包括“重量级”人物Don Box)错误地认为,JBI“包含EJB功能”,又或者是JAX-WS或 Web services (JSR 181)。
我可以理解他们弄错的原因。JBI的提出者将其描述为企业服务总线(ESB)的标准,这样就很容易推出一个“显而易见”的结论:JBI必定提供了一种使服务在服务总线上可用的便捷方法。这其实是不正确的。JBI实际是处于一个中间层。但它不是插在服务中,而是插在服务引擎中,它反过来又允许人们在其中插入服务。这里有着微妙的区别,因为可以驻留多个服务就也可以提供单一的服务。James Strachan写了一篇非常不错的文章,简要介绍了JBI。而本文的目的则是要澄清对JBI的误解。
我们来看一下如何通过JBI使普通的HelloWorld web服务可用。
下面的代码是一个JSR181web服务:
@WebServiceclass MyService {String greeting(String input) {return "Hello "+input;}}
如果您使用JBI服务引擎实现服务,您的代码将会类似于下面所示的我已经使其尽可能简单了,(不过当然要在JBI模型的约束下):
class MyServiceEngine implements Component, ComponentLifeCycle, Runnable {
DeliveryChannel channel;
ServiceEndpoint serviceEndpoint;
public void init(ComponentContext context)
throws JBIException
{
// Obtain reference to delivery channel
channel = context.getDeliveryChannel();
// Activate service endpoint (SEVICE2,ENDPOINT2)
serviceEndpoint = context.activateEndpoint(SERVICE2, ENDPOINT2);
// Spawn a thread to listen for messages.
new Thread(this);
}
/** Loop that listens for requests**/
void run() {
while (true) {
MessageExchange exchange = channel.accept();
if (exchange instanaceof InOut)
process((InOut) exchange);
else {
// Don't know how to send an error to the sender.
Log.log("I don't understand this: "+exchange);
}
}
}
/**Process one request and send the result **/
void process(InOut inOut) {
NormalizedMessage inMsg = inOut.getInMessage();
NormalizedMessage outMsg = inOut.createMessage();
try {
// Get the input as a DOM Text node
Node inNode = (Node)((DOMSource)outMsg.getContent ()).getNode();
// perform appropriate processing to inMsg
Node outNode = greet(inMsg);
// populate message content
outMsg.setContent(new DOMSource(outNode));
// attach message to exchange
inOut.setOutMessage(outMsg);
}
catch (Exception ex) {
inOut.setError(ex);
inOut.setStatus(ExchangeStatus.ERROR);
}
channel.send(inOut);
}
/** The real work **/
Node greet(Node inNode) {
String input = inNode.getTextContent();
String result = "Hello "+input;
Node outNode = inNode.getOwnerDocument().createTextNode (result);
return outNode;
}
}
显然,如果您的环境已经有了驻留web services,业务流程,XML变换和其他业务代码的引擎,那么就不适合使用JBI。
【责编:admin】
--------------------next---------------------