键值商店的兰博基尼
Camel是最好的面包集成框架,在本文中,我将向您展示如何通过利用另一个出色的项目Redis使它更加强大。
Camel 2.11即将发布,具有许多新功能,错误修复和组件。 这些新组件中的几个是我创作的, redis-component是我最喜欢的组件 。 Redis – ligth键/值存储区是一款出色的意大利软件,专为提高速度而设计(与Lamborghini相同– Lamborghini –这是一款两人座的意大利汽车,专为 速度)。 Redis用C语言编写,并且具有接近金属的内存,Redis的表现非常出色(Lamborgini的座右铭是“ Closer to the Road”)。 Redis通常被称为数据结构服务器,因为键可以包含字符串,哈希,列表和排序集。 快速,轻便的数据结构服务器对于软件工程师来说就像是一辆超级跑车,它只是飞行而已。 如果您想了解有关Redis和兰博基尼独特性能特征的更多信息,可以在Google周围找到自己。
Redis入门很容易:下载,制作和启动Redis服务器。 完成这些步骤之后,您就可以从Camel应用程序中使用它了。 该组件在内部使用Spring Data ,该数据又使用Jedis驱动程序,但有可能切换到其他Redis驱动程序。 以下是一些适合使用camel-redis组件的用例:
幂等存储库
幂等一词在数学中用于描述一个函数,如果将其应用到其自身上,将产生相同的结果。 在“消息传递”中,无论是一次还是多次接收,此概念都将转换为具有相同效果的消息。 在Camel中,此模式是使用IdempotentConsumer类实现的,该类使用一个Expression计算给定消息交换的唯一消息ID字符串。 然后可以在IdempotentRepository中查找此ID,以查看是否以前已看到过该ID; 如果消息已消耗; 如果不是,则处理该消息并将ID添加到存储库。 RedisIdempotentRepository使用集合结构来存储和检查现有ID。
<bean id="idempotentRepository" class="org.apache.camel.component.redis.processor.idempotent.RedisIdempotentRepository">
<constructor-arg value="test-repo"/>
</bean><route>
<from uri="direct:start"/>
<idempotentConsumer messageIdRepositoryRef="idempotentRepository">
<simple>${in.body.id}</simple>
<to uri="mock:result"/>
</idempotentConsumer>
</route>
快取
Redis的主要用途之一是作为LRU缓存 。 它可以将内存中的数据存储为Memcached,或者可以调整为持久刷新数据到日志文件,如果节点重新启动则可以重播。达到maxmemory时可以使用多种策略来创建满足特定需求的缓存:
- volatile-lru删除具有过期集的密钥中的一个,以尝试删除最近未使用的密钥。
- volatile-ttl删除具有过期集的密钥,并尝试删除剩余生存时间短的密钥。
- volatile-random从具有到期集的密钥中删除一个随机密钥。
- allkeys-lru类似于volatile-lru,但是将删除每种密钥,包括普通密钥或具有过期集的密钥。
- allkeys-random和volatile-random一样,但是将删除所有类型的键,包括普通键和具有过期集的键。
一旦您的Redis服务器配置了正确的策略并正在运行,您需要执行的操作是SET和GET:
<?xml version="1.0" encoding="UTF-8"?>
<route>
<from uri="direct:start"/>
<setHeader headerName="CamelRedis.Command">
<constant>SET</constant>
</setHeader>
<setHeader headerName="CamelRedis.Key">
<constant>keyOne</constant>
</setHeader>
<setHeader headerName="CamelRedis.Value">
<constant>valueOne</constant>
</setHeader>
<to uri="redis://localhost:6379"/>
</route>
与Redis的Interap发布/订阅
骆驼具有在路线之间进行交互的各种组件:
direct :在同一骆驼上下文中提供直接,同步的调用。
seda :异步行为,再次在同一骆驼上下文中在BlockingQueue上交换消息。
vm :类似于seda的异步行为,但只要它们在同一个JVM中,它还支持跨CamelContext的通信。 复杂的应用程序通常包括在单独的计算机上运行的多个独立的Camel实例。 对于这种情况,Camel提供了jms,activemq以及AWS SNS与SQS的组合,用于实例之间的消息传递。 Redis为发布/订阅消息范式提供了一个更简单的解决方案。 订阅者通过指定频道名称或使用模式匹配从多个频道接收消息来订阅一个或多个频道。 然后,发布者将消息发布到频道,然后Redis确保它到达所有匹配的订阅者。
<?xml version="1.0" encoding="UTF-8"?>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route startupOrder="1">
<from uri="redis://localhost:6379?command=SUBSCRIBE&channels=testChannel"/>
<to uri="mock:result"/>
</route><route startupOrder="2">
<from uri="direct:start"/>
<setHeader headerName="CamelRedis.Command">
<constant>PUBLISH</constant>
</setHeader>
<setHeader headerName="CamelRedis.CHANNEL">
<constant>testChannel</constant>
</setHeader>
<setHeader headerName="CamelRedis.MESSAGE">
<constant>Test Message</constant>
</setHeader>
<to uri="redis://localhost:6379"/>
</route>
</camelContext>
其他用法
保证的交付 :骆驼使用JMS,File,JPA和一些其他组件来支持此EIP。 Redis可以通过其事务支持用作轻量级键值持久存储。
通过EIP模式中的“ 声明检查” ,您可以用声明检查(唯一密钥)替换消息内容,该声明检查可在以后用于检索消息内容。 消息内容可以临时存储在Redis中。
Redis在实现计数器,排行榜,标签系统和更多功能方面也非常受欢迎。 现在,有了两把瑞士军刀,您所做的整合仅受您的想象力限制。
参考: Apache Camel在OFBIZian博客上会见了我们的JCG合作伙伴 Bilgin Ibryam的Redis 。
翻译自: https://www.javacodegeeks.com/2013/03/apache-camel-meets-redis.html