OpenHub 框架是下一个有趣的特性

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(136)   2024-03-31 16:21:05

这是OpenHub框架系列文章的第三篇——第一篇介绍OpenHub框架,第二篇介绍异步消息模型。

本系列的最后一篇文章将更详细地介绍一些其他有趣的功能,并将说明 OpenHub 可以成为您的集成项目的理想选择的原因。

节流

节流是一种检查集成平台输入请求计数的功能,如果此计数超过定义的限制,则新请求将受到限制。

节流的主要目标是限制集成平台不成比例的(通常是故意的)过载处理大量输入请求。这会对应用程序性能产生不良影响,甚至会停止当前消息的处理。

节流组件 计算来自指定源(外部)系统和特定操作的输入请求。如果此计数在定义的时间间隔内超过定义的限制,则 OpenHub 将开始拒绝新的输入请求(仅来自指定源系统和指定操作的请求)——抛出异常。节流组件支持集群。

节流功能可以配置如下:

###############################################################################
#  Throttling configuration
#
#   There the following property names:
#   - throttling.defaultInterval: default time interval (in seconds) if not defined by system/operation
#   - throttling.defaultLimit: default limit if not defined by system/operation
#   - throttling.sourceSystem.operationName, where
#       - sourceSystem is specific source system or '*' if any system
#            (source system is case-insensitive value from trace header (ExternalSystemExtEnum))
#       - operationName is specific operation name or '*' if any operation
#
#   Property values (except for default values) have the following format:
#       limit [/interval]
#
#   Examples:
#       throttling.crm.op1=10
#       throttling.crm.*=10/40
#       throttling.*.sendSms=60/30
###############################################################################
  
throttling.defaultInterval=60
throttling.defaultLimit=60
throttling.sourceSystem.*=300/60
throttling.*.syncHello=15/60
throttling.*.asyncHello=50/60

例如:

throttling.crm.op1=10(限制从 CRM 系统调用操作 op1 10 个请求,持续 60 秒)节流。 crm.*=10/40(限制从 CRM 系统调用任何操作 10 个请求,持续 40 秒)throttling.*.sendSms=60/30(限制从任何系统调用操作 sendSms 到 60 个请求,持续 30 秒)

警报

Alerts 定义监视数据库数据的指标,如果任何指标超过其限制,则会激活警报并可以执行进一步的操作。

指标是可配置的——用于获取项目计数和检查限制的 SQL 查询。

警报示例(也有后续操作):

  • 当过去 10 分钟的失败消息数超过 5 条时,会向管理员发送电子邮件
  • 当等待外部系统响应超过 5 分钟的消息数超过 10 条时,则向管理员发送电子邮件

默认配置示例:

###############################################################################
#  Alerts configuration
#
#   There the following property names:
#   - alerts.N.id: unique alert identification (if not defined then order number (=N) is used instead)
#   - alerts.N.limit: limit that must be exceeded to activate alert
#   - alerts.N.sql: SQL query that returns count of items for comparison with limit value
#   - [alerts.N.enabled]: if specified alert is enabled or disabled; enabled is by default
#   - [alerts.N.mail.subject]: notification (email, sms) subject; can be used Java Formatter placeholders (%s = alert ID)
#   - [alerts.N.mail.body]: notification (email, sms) body; can be used Java Formatter placeholders (%d = actual count, %d = limit)
#
###############################################################################
  
# checks if there is any waiting message that exceeds time limit for timeout
alerts.900.id=WAITING_MSG_ALERT
alerts.900.limit=0
alerts.900.sql=SELECT COUNT(*) FROM message WHERE state = 'WAITING_FOR_RES' AND last_update_timestamp < (current_timestamp - interval '3600 seconds')

注意:每个配置都可以通过 JMX 即时设置。

预定作业

OpenHub 支持两种类型的计划作业:

  1. 可以在随机节点上运行并可以并发执行的作业(不是同时启动作业的条件
  2. 在集群中只能运行一次的作业,无论在哪个节点上(注意:我们不考虑计划作业必须仅在特定节点上运行的可能性)

OpenHub 框架为作业定义提供了自己的 API。

配置示例:

@OpenHubQuartzJob(name = "AsyncPostponedJob", executeTypeInCluster = JobExecuteTypeInCluster.NOT_CONCURRENT,
        simpleTriggers = @QuartzSimpleTrigger(repeatIntervalMillis = 30000))
public void invokePostponedJob() {}
@OpenHubQuartzJob(name = "MoreTriggerJob", executeTypeInCluster = JobExecuteTypeInCluster.CONCURRENT,
        cronTriggers = {
                @QuartzCronTrigger(cronExpression = "0 00 23 ? * *",
                        name = "FirstTriggerForJob",
                        group = "MoreTriggerGroup"),
                @QuartzCronTrigger(cronExpression = "0 00 10 ? * *",
                        misfireInstruction = CronTriggerMisfireInstruction.FIRE_ONCE_NOW,
                        name = "SecondTriggerForJob",
                        group = "MoreTriggerGroup")},
        simpleTriggers = {
                @QuartzSimpleTrigger(repeatIntervalMillis = 10000,
                        repeatCount = 20,
                        name = "ThirdTriggerForJob",
                        group = "MoreTriggerGroup"),
                @QuartzSimpleTrigger(repeatIntervalProperty = ASYNCH_PARTLY_FAILED_REPEAT_TIME_SEC,
                        intervalPropertyUnit = SimpleTriggerPropertyUnit.SECONDS,
                        misfireInstruction = SimpleTriggerMisfireInstruction.FIRE_NOW,
                        name = "FourthTriggerForJob",
                        group = "MoreTriggerGroup")
        })
public void invokeJob() {}

请求/响应跟踪

请求/响应跟踪功能允许将路由之间的内部通信或与外部系统的通信保存到数据库中。之后,您可以直接进入数据库并浏览请求响应 表或查看管理控制台。

消息详细信息——请求/响应跟踪

错误处理

Apache Camel 中有一个基本的错误处理,但 OpenHub 框架有自己的概念来处理错误:

  • 有自己的异常层次结构和基本的IntegrationException
  • 错误目录定义了带有描述的唯一错误代码——这有助于识别源系统中的问题
  • 错误目录显示在管理控制台中

错误目录

标签2: Java教程
地址:https://www.cundage.com/article/jcg-openhub-framework-next-interesting-features.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...