前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >航空App的订餐系统(上):完整设计一个高级应用-第三篇

航空App的订餐系统(上):完整设计一个高级应用-第三篇

作者头像
魏新宇
发布2018-10-23 15:15:22
1.3K0
发布2018-10-23 15:15:22
举报

版权说明:本文书写过程中参照了红帽的技术文档;本系列文章中的部分测试代码为红帽公司版权所有,因此不能提供源码文件。

  • 本文的内容仅限于技术探讨,不能作为指导生产环境的素材;
  • 本文分为系列文章,将会有多篇,初步预计将有多篇。
  • 笔者鼓励读者购买红帽培训获得更多系统性的培训。

阅读本篇之前,请先行阅读本系列前两篇:

一个高级应用设计概要:完整设计一个高级应用-第一篇

航空公司应用的源码分析:完整设计一个高级应用-第二篇

膳食订购

当管理员执行航班时,所有要求的餐食必须从三家餐饮公司之一订购。每个餐饮公司都有不同的接收界面:

  • 如果用餐是素食,使用FTP创建名为Fnnnnn.xml的文件,其中nnnn是航班ID(不是航班号)。该文件包含XML格式的预留。此航班的所有素食餐点应合并为此文件。
  • 如果用餐是犹太餐,则为每个预订(XML格式)调用REST服务。 Web服务的地址是http:// localhost:8080 / jbtravel / rest / meals / order。订单没有合并。
  • 选择其他,用餐订单会写入目录中的文件。该文件的名称是Fnnnnn.xml,其中nnnn是航班ID(不是航班号)。该文件包含以XML格式包含这些其他膳食类型的航班的组合预订。

三种方案:

  • JBoss EAP为此问题提供了第一个可能的解决方案。 在FlightBean EJB commitFlight()方法中,调用一些逻辑来同步操作FTP、文件和REST Web服务以满足要求。 这涉及将预留转换为XML并根据需要组合预留。
  • Boss Fuse为OSGI容器提供了第二种可能的解决方案。 在Camel中,可以基于某些触发器(例如队列条目)异步执行基于内容的路由(CBR)。 ESB会将XML格式的预留路由到正确的输出介质。
  • 由JBoss Red Hat JBoss A-MQ产品提供的。 第一种解决方案的不同之处在于,作业将使用基于队列条目触发器的MDB异步发生。

第二种解决方案是这种情况的最佳解决方案。 飞行对象将被放置到A-MQ队列上,并使用Camel路由拾取对象,按膳食类型(CBR)路由,转换为XML、根据需要组合记录,并将记录发送到适当的目的地。

选择此解决方案是因为内置错误处理、XML转换以及用于FTP、文件和REST Web服务的预编写处理程序。 这些项目将促进发展,并且它们是可靠的。

排队

JBoss A-MQ是一种基于标准的开放式消息传递系统,可降低集成不同应用程序的复杂性。 它通过为多种语言和标准化包装框架提供一组API来实现这一目标。

它由以下部分组成:

  • Broker:管理,接收和发送消息。
  • 多种语言的API实现:允许Java,C,C ++,Ruby和Perl开发人员访问ActiveMQ。

连接工厂。 连接工厂(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
  • TextMessage textMsg = session.createTextMessage(); textMsg.setText(“Hello World”);
  • ObjectMessage
  • ObjectMessage objMsg = session.createObjectMessage(new SerializableObject());
  • MapMessage
  • MapMessage mapMsg = session.createMapMessage(); mapMsg.setInt(“name”, 1000);
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大魏分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档