技术文章
智能代理
本周,我们将探索另一种系统管理模式智能代理.
什么时候使用这个模式?
类时使用智能代理请求-应答场景。特别是当返回地址模式被应用。智能代理接收请求并更改返回地址这样它就可以监控响应。当响应到达时,Smart Proxy将响应发送回原始响应返回地址一旦监控步骤完成。
CPI中的智能代理
不幸的是,我无法在CPI中实现该模式。这就是我所尝试的。
实施总结
智能代理的实现使用来自的示例返回地址博客。不过,本博客将使用SAP企业消息传递,而不是Microsoft Azure服务总线。
这个场景返回地址博客如下。客户数据从发送器系统发送。但是,发送方系统希望在单独的队列中获得响应。因此,发送器系统设置JMSReplyTo标头。客户数据处理器将响应放入JMSReplyTo报头指定的队列中。最后,发送方可以处理响应。
在智能代理中,我们将拦截第一步,即请求消息被发送到智能代理,而不是直接发送到队列。智能代理将JMSReplyTo头存储在数据存储中,JMSCorrelationId作为条目Id,并用它自己的地址覆盖JMSReplyTo。作为响应,智能代理将使用JMSCorrelationId获取原始消息,并将消息放入JMSReplyTo报头指定的原始队列中。
1.使客户排队
属性立即开始此流定时器启动事件.准备输入消息内容修改器设置主体。设置JMS报头内容修改器设置JMSCorrelationId, JMSDestination和JMSReplyTo报头。ProcessDirect接收器适配器将调用智能代理流。
设置JMS头内容修饰符的配置
Headers选项卡有这些条目。
行动 | 名字 | 类型 | 数据类型 | 价值 | 默认的 |
---|---|---|---|---|---|
创建 | JMSCorrelationId | XPath | 字符串 | /客户/ Id | |
创建 | JMSDestination | 常数 | 队列:客户 | ||
创建 | JMSReplyTo | 常数 | 队列:CustomerResponses |
2.智能代理-处理请求消息
类型接收请求消息ProcessDirect发送器适配器.将其放在数据存储中,条目Id为JMSCorrelationId数据存储写操作.接下来,设置JMS报头内容修改器将覆盖JMSReplyTo头与“队列:SmartProxy”.的AMQP接收器适配器将消息放入JMSDestination头指定的队列中。
JMSCorrelationId、JMSDestination和JMSReplyTo头列在Runtime Configuration选项卡下的Allowed Header中。
数据存储写操作配置
财产 | 价值 |
---|---|
数据存储名称 | SmartProxy |
可见性 | 集成流 |
条目ID | ${头。JMSCorrelationId} |
告警保留阈值(d) | 2 |
有效期(d) | 90 |
加密存储的消息 | 无节制的 |
覆盖现有消息 | 无节制的 |
包含消息头 | 检查 |
设置JMS头内容修饰符的配置
行动 | 名字 | 类型 | 数据类型 | 价值 | 默认的 |
---|---|---|---|---|---|
创建 | JMSReplyTo | 常数 | 队列:SmartProxy |
AMQP接收器适配器的配置
选项卡 | 财产 | 价值 |
---|---|---|
连接 | 宿主 | enterprise-messaging-messaging-gateway.cfapps.eu10.hana.ondemand.com |
连接 | 港口 | 443 |
连接 | 路径 | /协议/ amqp10ws |
连接 | 代理类型 | 互联网 |
连接 | TLS连接 | 检查 |
连接 | 身份验证 | OAuth2客户端凭证 |
连接 | 凭据名称 | 企业消息传递 |
处理 | 目的地类型 | 队列 |
处理 | 目的地名称 | ${头。JMSDestination} |
处理 | 有效期(单位:秒) | |
处理 | 交付 | 持续的 |
处理 | 消息类型 | 自动 |
3.处理客户
此流接收使用的客户数据AMQP发送器适配器.为简单起见,我们总是将主体设置为Successful payload using内容修改器.最后,AMQP接收器适配器将在JMSReplyTo头指定的队列中对响应进行排队。
标头JMSCorrelationId和JMSReplyTo列在Runtime Configuration选项卡下的Allowed标头中。
AMQP发送器适配器的配置
连接选项卡与“”节中指定的完全相同。2.智能代理-处理请求消息".“Processing”页签的配置如下:
选项卡 | 财产 | 价值 |
---|---|---|
处理 | 队列名称 | 队列:客户 |
处理 | 并发进程数 | 1 |
处理 | Max。预取消息数 | 5 |
处理 | Max。重试次数 | 0 |
处理 | Max后的交付状态重试 | 拒绝了 |
AMQP接收器适配器的配置
配置与“”节中指定的完全相同。2.智能代理-处理请求消息"除了目的名称。“目的名称”设置为${头。JMSDestination}.
选项卡 | 财产 | 价值 |
---|---|---|
处理 | 目的地名称 | ${头。JMSDestination} |
4.智能代理——处理响应消息
类中的消息SmartProxy队列使用AMQP发送器适配器.对象将消息体备份到交换属性内容修改器.数据存储获取操作用于恢复原始JMSReplyTo报头的值。接下来,使用另一个Content Modifier恢复主体。最后,AMQP接收器适配器将响应消息放入JMSReplyTo报头指定的队列中。
标头JMSCorrelationId和JMSReplyTo列在Runtime Configuration选项卡下的Allowed标头中。
AMQP发送器适配器的配置
该配置与第3节中指定的配置完全相同。处理除队列名之外的客户。“队列名称”设置为队列:SmartProxy.
选项卡 | 财产 | 价值 |
---|---|---|
处理 | 队列名称 | 队列:SmartProxy |
配置数据存储获取操作
财产 | 价值 |
---|---|
数据存储名称 | SmartProxy |
可见性 | 集成流 |
条目ID | ${头。JMSCorrelationId} |
完成后删除 | 检查 |
在缺少条目时抛出异常 | 无节制的 |
AMQP接收器适配器的配置
配置与“”节中指定的完全相同。2.智能代理-处理请求消息"除了目的名称。“目的名称”设置为${头。JMSReplyTo}.
选项卡 | 财产 | 价值 |
---|---|---|
处理 | 目的地名称 | ${头。JMSReplyTo} |
5.处理客户响应
此流只是使用的响应AMQP发送器适配器并使用著名的日志记录有效载荷Groovy脚本.
AMQP发送器适配器的配置
该配置与第3节中指定的配置完全相同。处理除队列名之外的客户。“队列名称”设置为队列:CustomerResponses.
选项卡 | 财产 | 价值 |
---|---|---|
处理 | 队列名称 | 队列:CustomerResponses |
问题和选择
问题发生在第3步。SAP企业消息传递不返回JMSCorrelationId报头。因此,步骤4没有接收到JMSCorrelationId,并且无法恢复JMSReplyTo报头。
替代方案1:使用标准JMS
标准JMS不支持JMS接收器适配器中的动态队列名称。因此,第2步无法实现。反过来,智能代理不能用标准JMS实现。
备选方案2:测试AMQP适配器支持的其他提供者
也许,智能代理可以与AMQP适配器支持的其他提供商一起实现,如Microsoft Azure Service Bus, Solace PubSub+, Apache Qpid Broker-J, Apache ActiveMQ 5和ActiveMQ Artemis, IBM MQ, RabbitMQ。
如果你知道如何解决这个问题,或者如果你知道任何替代方案是否有效,请在下面评论:)。
EIPinCPI评级
不幸的是,我无法实现智能代理模式。所以,我必须给这种模式打0分(满分10分)。
结论
智能代理用于监控消息时返回地址使用模式。
引用/进一步阅读
- 企业集成模式中的智能代理模式
- EIPinCPI
- CPI组件
希望这能有所帮助,
巴拉