ActiveMQ-Camel的使用
?????????? 在一个电子系统中可能接受来自不同供应商的各种订单信息,不同类型的订单走的流程不尽相同,为了快速处理各种不同的订单完成不同的业务。特定义不同的路由信息。根据路由信息的不同,将消息进行不同的处理。如果采用ActiveMQ那么最好采用apache-camel整合,使不同的消息根据不同的流程自动处理到不同的队列中去。
?
采用的jar文件如下:
<?xml version="1.0" encoding="UTF-8"?><classpath><classpathentry kind="src" path="src"/><classpathentry kind="src" path="resources"/><classpathentry kind="src" path="message"/><classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/><classpathentry kind="con" path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING20_CORE"/><classpathentry kind="con" path="melibrary.com.genuitec.eclipse.j2eedt.core.MYECLIPSE_JAVAEE_5_CONTAINER"/><classpathentry kind="lib" path="src/activemq-all-5.5.0.jar"/><classpathentry kind="lib" path="src/activemq-pool-5.5.0.jar"/><classpathentry kind="lib" path="src/camel-core-2.7.0.jar"/><classpathentry kind="lib" path="src/camel-jetty-2.7.0.jar"/><classpathentry kind="lib" path="src/camel-jms-2.7.0.jar"/><classpathentry kind="lib" path="src/log4j-1.2.14.jar"/><classpathentry kind="lib" path="src/slf4j-log4j12-1.5.11.jar"/><classpathentry kind="lib" path="src/commons-management-1.0.jar"/><classpathentry kind="lib" path="resources/commons-logging-1.1.1.jar"/><classpathentry kind="lib" path="src/camel-spring-2.7.0.jar"/><classpathentry kind="lib" path="src/org.springframework.aop-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.asm-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.aspects-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.beans-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.context-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.context.support-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.core-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.expression-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.instrument-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.instrument.tomcat-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.jdbc-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.jms-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.orm-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.oxm-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.transaction-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.web-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.web.portlet-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.web.servlet-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/org.springframework.web.struts-3.0.4.RELEASE.jar"/><classpathentry kind="lib" path="src/jetty-all-server-7.1.6.v20100715.jar"/><classpathentry kind="lib" path="src/jetty-websocket-7.1.6.v20100715.jar"/><classpathentry kind="output" path="bin"/></classpath>
?
package easyeway.mq.app.demo1;import javax.jms.ConnectionFactory;import org.apache.activemq.ActiveMQConnectionFactory;import org.apache.camel.CamelContext;import org.apache.camel.Exchange;import org.apache.camel.Processor;import org.apache.camel.builder.RouteBuilder;import org.apache.camel.component.jms.JmsComponent;import org.apache.camel.impl.DefaultCamelContext;/** * 设置一系列观察一个目录中新订单情况的路由信息,获取文件,并转换为相关的JMS消息 *,发送他们到不同的对应的不同队列中。进行相关的处理。 * * @author longgangbai * */public class OrderRouterWithRecipientListBean { public static void main(String args[]) throws Exception { // create CamelContext //创建一个CamelContext CamelContext context = new DefaultCamelContext(); // connect to embedded ActiveMQ JMS broker //创建一个ActiveMQ类型 连接工厂 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost"); //采用JMS组件发送消息 context.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory)); // add our route to the CamelContext //添加自定义路由信息到CamelContext context.addRoutes(new RouteBuilder() { @Override public void configure() { // load file orders from src/data into the JMS queue //从src/data加载文件订单生成生成jms,将消息放到jms队列中 //src/data为定义的接受订单的目录 from("file:src/data?noop=true").to("jms:incomingOrders"); // content-based router //根据路由信息将消息从队列总分配到本地不同的其他消息中 from("jms:incomingOrders") .choice() .when(header("CamelFileName").endsWith(".xml")) .to("jms:xmlOrders") .when(header("CamelFileName").regex("^.*(csv|csl)$")) .to("jms:csvOrders") .otherwise() .to("jms:badOrders"); //将消息进行相关的业务处理 from("jms:xmlOrders").bean(RecipientListBean.class); // test that our route is working //业务逻辑的处理过程 from("jms:accounting").process(new Processor() { public void process(Exchange exchange) throws Exception { System.out.println("Accounting received order: " + exchange.getIn().getHeader("CamelFileName")); } }); from("jms:production").process(new Processor() { public void process(Exchange exchange) throws Exception { System.out.println("Production received order: " + exchange.getIn().getHeader("CamelFileName")); } }); } }); // start the route and let it do its work context.start(); Thread.sleep(2000); // stop the CamelContext context.stop(); }}?
?
package easyeway.mq.app.demo1;import org.apache.camel.RecipientList;import org.apache.camel.language.XPath;/** * Recipient List bean that sends orders to the production and * accounting queues if the order originated from a gold customer. * Otherwise, the order is only sent to the accounting queue. * * The recipient list annotation is used to accomplish this. * * @author longgangbai * */public class RecipientListBean {/** * 根据路由中订单信息用户的信息判断是否是金卡用户 * @param customer * @return */ @RecipientList public String[] route(@XPath("/order/@customer") String customer) { if (isGoldCustomer(customer)) { return new String[] {"jms:accounting", "jms:production"}; } else { return new String[] {"jms:accounting"}; } } private boolean isGoldCustomer(String customer) { return customer.equals("honda"); }}?