基于内容的路由器首先检查消息的内容,并根据消息中包含的数据把消息路由到不同的通道上。可以根据许多标准来完成路由,如是否存在某些字段、是否有指定的字段值等。实现基于内容的路由器时,由于可能会频繁维护路由器,所以要特别注意路由功能应当易于维护。在更复杂的集成环境中,基于内容的路由器可能会以可配置规则引擎的形式出现,可以根据一组可配置的规则来计算目标通道。
背景:
假设一个公司销售配件(A)和零部件(B),并有两个库存系统,我们需要把新的订单路由到正确的库存系统中以便处理。
代码实现:
背景:
假设一个公司销售配件(A)和零部件(B),并有两个库存系统,我们需要把新的订单路由到正确的库存系统中以便处理。
代码实现:
新订单
package com.foshanshop.ejb3.app;
import javax.jms.*;
import javax.jms.Queue;
import java.util.*;
import javax.naming.*;
public class QueueSender {
public static void main(String []args)
{
QueueConnection conn=null;
QueueSession session=null;
try
{
Properties props=new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
props.setProperty(Context.PROVIDER_URL, "localhost:1099");
props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
InitialContext ctx = new InitialContext(props);
QueueConnectionFactory factory=(QueueConnectionFactory)ctx.lookup("QueueConnectionFactory");
conn=factory.createQueueConnection();
session=conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Destination destination=(Queue)ctx.lookup("queue/FQueue");
MessageProducer producer=session.createProducer(destination);
TextMessage msg=session.createTextMessage("w product");
producer.send(msg);
}
catch(Exception e)
{
System.out.println("queueSender main has a problem"+":"+e.toString());
}
}
}
路由器:
package com.foshanshop.ejb3.impl;
import java.util.Properties;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.ejb.*;
@MessageDriven(activationConfig={@ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",propertyValue="queue/FQueue"),@ActivationConfigProperty(propertyName="acknowledgeMode",propertyValue="Auto-acknowledge")})
public class FQueueBean implements MessageListener {
public void onMessage(Message msg) {
// TODO Auto-generated method stub
QueueConnection conn=null;
QueueSession session=null;
try
{
Properties props=new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
props.setProperty(Context.PROVIDER_URL, "localhost:1099");
props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
InitialContext ctx = new InitialContext(props);
QueueConnectionFactory factory=(QueueConnectionFactory)ctx.lookup("QueueConnectionFactory");
conn=factory.createQueueConnection();
session=conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Destination destinationA=(Queue)ctx.lookup("queue/FQueueA");
Destination destinationB=(Queue)ctx.lookup("queue/FQueueB");
if(msg instanceof TextMessage)
{
TextMessage tmsg=(TextMessage)msg;
String text=tmsg.getText();
if(text.startsWith("w"))
{
MessageProducer producer=session.createProducer(destinationA);
producer.send(msg);
}
else if(text.startsWith("s"))
{
MessageProducer producer=session.createProducer(destinationB);
producer.send(msg);
}
}
}
catch(Exception e)
{
System.out.println("FQueueBean has a problem"+":"+e.toString());
}
}
}
A库存系统:
package com.foshanshop.ejb3.impl;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
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/FQueueA"),@ActivationConfigProperty(propertyName="acknowledgeMode",propertyValue="Auto-acknowledge")})
public class FQueueABean implements MessageListener {
public void onMessage(Message msg) {
// TODO Auto-generated method stub
try
{
if(msg instanceof TextMessage)
{
TextMessage tmsg=(TextMessage)msg;
System.out.println("FQueueABean:"+tmsg.getText());
}
}
catch(Exception e)
{
System.out.println("there is a problem in FQueueA"+":"+e.toString());
}
}
}
B库存系统:
package com.foshanshop.ejb3.impl;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
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/FQueueB"),@ActivationConfigProperty(propertyName="acknowledgeMode",propertyValue="Auto-acknowledge")})
public class FQueueBBean implements MessageListener {
public void onMessage(Message msg) {
// TODO Auto-generated method stub
try
{
if(msg instanceof TextMessage)
{
TextMessage tmsg=(TextMessage)msg;
System.out.println("FQueueBBean:"+tmsg.getText());
}
}
catch(Exception e)
{
System.out.println("there is a problem in FQueueA"+":"+e.toString());
}
}
}