我创建了一个小项目 ,该项目展示了如何将JBoss Infinispan与Apache Camel和幂等消费者模式一起使用,以确保消息不会在集群环境中被处理两次。
假设您有一个应用程序,该应用程序必须通过将其部署在多个容器上才能轻松扩展。 但是应用程序必须在整个集群中仅处理一次唯一请求。 解决方案很简单:将Camel中的幂等消费者模式与易于扩展的存储库一起使用。 这就是Infinispan发挥作用的地方。 Infinispan具有极高的可扩展性,高度可用的键/值存储和数据网格。 如果将InfinispanIdempotentRepository与幂等的使用者一起使用,它将创建一个内存中的高速缓存来存储请求,并且在您启动该应用程序的另一个实例时,高速缓存实例将同步,并且所有应用程序中的幂等的使用者将不会处理现有的请求。不再。
通过此项目 (幂等的消费者demo5),您可以启动任意数量的容器,每个容器将从8080(http:// localhost:8080 / idempotent / KEY)开始在新端口上启动剩余端点,如果执行带有密钥的GET请求,对其他任何容器具有相同密钥的后续请求将被拒绝。 在后台,Infinispan将在整个Camel应用程序集群中复制所有已处理的密钥,并确保一致性。
该应用程序的核心是以下路由定义,该路由定义为该应用程序的每个实例查找一个新的空闲端口号:
public class IdempotentRoute extends RouteBuilder {private static final transient Logger LOGGER = LoggerFactory.getLogger(IdempotentRoute.class);private InfinispanIdempotentRepository infinispanRepo;private int port;@Overridepublic void configure() throws Exception {from("restlet:http://localhost:" + port + "/idempotent/{key}?restletMethods=GET").idempotentConsumer(header("key"), infinispanRepo).setBody(simple("UNIQUE REQUEST ACCEPTED: ${header.key}")).stop().end().setBody(simple("REQUEST REJECTED: ${header.key}"));}public InfinispanIdempotentRepository getInfinispanRepo() {return infinispanRepo;}public void setInfinispanRepo(InfinispanIdempotentRepository infinispanRepo) {this.infinispanRepo = infinispanRepo;}public void start() {port = AvailablePortFinder.getNextAvailable(8080);LOGGER.info("Using port: " + port);}
}
很简单,不是吗。
翻译自: https://www.javacodegeeks.com/2014/08/clustered-idempotent-consumer-pattern-with-infinispan.html