版权说明:本文书写过程中参照了红帽的技术文档;本系列文章中的部分测试代码为红帽公司版权所有,因此不能提供源码文件。
阅读本篇之前,请先行阅读本系列前两篇:
膳食订购
当管理员执行航班时,所有要求的餐食必须从三家餐饮公司之一订购。每个餐饮公司都有不同的接收界面:
三种方案:
第二种解决方案是这种情况的最佳解决方案。 飞行对象将被放置到A-MQ队列上,并使用Camel路由拾取对象,按膳食类型(CBR)路由,转换为XML、根据需要组合记录,并将记录发送到适当的目的地。
选择此解决方案是因为内置错误处理、XML转换以及用于FTP、文件和REST Web服务的预编写处理程序。 这些项目将促进发展,并且它们是可靠的。
排队
JBoss A-MQ是一种基于标准的开放式消息传递系统,可降低集成不同应用程序的复杂性。 它通过为多种语言和标准化包装框架提供一组API来实现这一目标。
它由以下部分组成:
连接工厂。 连接工厂(ActiveMQConnectionFactory)创建用于访问代理的连接对象。 JMS规范要求创建的对象必须是超类型javax.jms.Connection。 此特定类型保证创建的连接是ActiveMQ,这允许在代理上设置其他参数或控件。
或者,使用ActiveMQConnectionFactory的设置和属性激活A-MQ代理增强功能。
连接工厂有两种方式:
在容器内:连接工厂由容器注入。
@Resource(mappedName = "JNDI_NAME_OF_CONNECTION_FACTORY")
private ConnectionFactory connectionFactory;
独立应用程序:连接工厂通过JNDI查找获得。
Context context = new InitialContext();
ConnectionFactory factory = (ConnectionFactory) context.lookup(CONNECTION_FACTORY_NAME);
连接。 连接是客户端用于指定传输协议和凭证以与代理进行持续交互的对象。
从连接工厂获得连接。
conn = connectionFactory.createConnection();
会话。 会话由客户端在与代理建立的连接上创建。 它们定义消息是否将被处理,而确认消息则不是。 客户端可以在单个连接上创建多个会话。
从连接获得会话。
目的地。 目标是由客户端基于每个会话创建的。 它们是发送消息的队列或主题的客户端表示。 消息代理也维护自己的目标表示。
目的地以两种方式获得:
从会话中获得。
Destination myQueue = (Queue) session.createQueue(“MyQueue”);
由JNDI查找获得。
Destination myQueue = context.lookup("queue/MyQueue");
Producer.Producer 是客户端对象,它们创建消息并将消息发送给代理。 它们是基于每个会话创建的MessageProducer接口的实例。 MessageProducer接口提供了发送消息和设置各种消息头的方法,包括控制消息持久性的JMSDeliveryMode,控制消息优先级的JMSPriority和控制消息生命周期的JMSExpiration。
Producer 从会话中获得。
消费者。 消费者是处理从代理检索的消息的客户端对象。 它们是基于每个会话创建的MessageConsumer接口的实例。 MessageConsumer接口可以使用MessageConsumer.receive()方法之一同步使用消息,也可以通过使用MessageConsumer.setMessageListener()方法注册MessageListener来异步使用消息。 通过在目标上注册MessageListener,到达目标的消息将调用使用者的MessageListener.onMessage()方法,从而使消费者不必重复轮询目标以获取消息。
消费消息有两种模式:同步和异步。
异步消息使用消息传入消息的MessageListener。 MessageListener可以内联实现,也可以使用内部类来定义消息监听器。
消息。 消息是客户端应用程序传输和交换业务数据和事件的手段。 它们是消息提供者的基本工作单元。
消息包含文本或二进制有效负载。 它们还包含元数据,提供有关消息的其他信息。 应用程序以编程方式使用元数据来修改或微调消息传递,或者以管理方式监视消息传递系统的运行状况。
JMS API定义了六种类型的消息体:
JMS API提供了直观命名的方法来创建每种类型的消息:
TextMessage
ObjectMessage
MapMessage