...
The ServiceMix Bean component provides integration with beans (POJOs) with the JBI bus to make it easy to use POJOs to process JBI message exchanges.
POJOs
There are several kind of POJOs you can deploy to servicemix-bean
.
MessageExchangeListener
The first kind of POJOs you can deploy implement the MessageExchagneListener
interface. In such a case, servicemix-bean
acts as a replacement of the lightweight container component. This level offers the most control on the exchange received and sent. This is usually used with the injected DeliveryChannel
to send back the exchanges, or if the POJOs needs to act as a consumer (i.e. creating and sending exchanges to other services).
These POJOs are low-level POJOs: you need to understand the JBI Api and Message Exchange Patterns to correctly handle incoming exchanges.
Note that at this point (v 3.1), there is no base class that you can inherit to speed you in this process of implementing a POJO to handle JBI exchanges, but hopefully it will come in the future.
Section |
---|
Column |
---|
This example on the right shows the most simple bean. When it receives an exchange, it will print it to the console and set the status to DONE before sending the exchange back. This bean can not handle InOut exchanges, as it does not set any response (an exception would be thrown in such a case). |
Column |
---|
Code Block |
---|
lang | java |
---|
title | Trace example |
---|
|
import org.apache.servicemix.MessageExchangeListener;
import javax.annotation.Resource;
import javax.jbi.messaging.DeliveryChannel;
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.MessagingException;
public class ListenerBean implements MessageExchangeListener {
@Resource
private DeliveryChannel channel;
public void onMessageExchange(MessageExchange exchange) throws MessagingException {
System.out.println("Received exchange: " + exchange);
exchange.setStatus(ExchangeStatus.DONE);
channel.send(exchange);
}
}
|
|
|
Section |
---|
Column |
---|
This example will handle an InOut exchange and will send back the input as the response. Note that this example would fail if receiving an InOnly exchange, as setting a response on an InOnly exchange is not a legal operation. |
Column |
---|
Code Block |
---|
lang | java |
---|
title | Echo example |
---|
|
import org.apache.servicemix.MessageExchangeListener;
import org.apache.servicemix.jbi.util.MessageUtil;
import javax.annotation.Resource;
import javax.jbi.messaging.DeliveryChannel;
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.MessagingException;
public class ListenerBean implements MessageExchangeListener {
@Resource
private DeliveryChannel channel;
public void onMessageExchange(MessageExchange exchange) throws MessagingException {
if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
MessageUtil.transferInToOut(exchange, exchange);
channel.send(exchange);
}
}
}
|
|
|
Deployment
Currently (v 3.1), servicemix-bean supports two different deployment models. The first one uses an xbean.xml configuration file where one can configure the different endpoints / beans that will be used. The other one only works with a static configuration file (servicemix.xml) and can not be used with standard JBI packaging but allows automatic detection of the beans to expose.
...
URI
You can use a handy URI to refer to beans using the Spring names of beans.
...