Package org.axonframework.eventstore.redis

Source Code of org.axonframework.eventstore.redis.RedisEventStore

/*
* Copyright (c) 2010-2012. Axon Framework
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.axonframework.eventstore.redis;

import org.axonframework.common.io.IOUtils;
import org.axonframework.domain.DomainEventMessage;
import org.axonframework.domain.DomainEventStream;
import org.axonframework.eventstore.EventStore;
import org.axonframework.repository.ConcurrencyException;
import org.axonframework.serializer.Serializer;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

/**
* @author Allard Buijze
*/
public class RedisEventStore implements EventStore {

    private Serializer eventSerializer;
    private RedisConnectionProvider redisConnectionProvider;

    @Override
    public void appendEvents(String type, final DomainEventStream events) {
        Jedis jedis = redisConnectionProvider.newConnection();
        DomainEventMessage firstEvent = events.peek();
        final byte[] key = (type + "." + firstEvent.getAggregateIdentifier()).getBytes(IOUtils.UTF8);
        jedis.watch(key);
        Long eventCount = jedis.llen(key);
        if ((firstEvent.getSequenceNumber() != 0 && eventCount == null)
                || firstEvent.getSequenceNumber() != eventCount) {
            jedis.unwatch();
            throw new ConcurrencyException(
                    String.format("Concurrent modification detected for Aggregate identifier [%s], sequence: [%s]",
                                  firstEvent.getAggregateIdentifier(),
                                  firstEvent.getSequenceNumber()));
        }

        try {
//            jedis.pipelined(new PipelineBlock() {
//                @Override
//                public void execute() {
            Transaction multi = jedis.multi();
            while (events.hasNext()) {
                DomainEventMessage domainEvent = events.next();
                multi.rpush(new String(key, IOUtils.UTF8), new String(eventSerializer.serialize(domainEvent, byte[].class)
                                                                             .getData(), IOUtils.UTF8));
            }
            multi.exec();
//                }
//            });
//            redis.clients.jedis.Transaction transaction = jedis.multi();
//            while (events.hasNext()) {
//                DomainEvent domainEvent = events.next();
//
//                transaction.rpush(new String(key, UTF8), new String(eventSerializer.serialize(domainEvent), UTF8));
//            }
//            transaction.exec();
        } finally {
            redisConnectionProvider.closeConnection(jedis);
        }
    }

    @Override
    public DomainEventStream readEvents(String type, Object identifier) {
        throw new UnsupportedOperationException("Method not yet implemented");
    }

    public void setEventSerializer(Serializer serializer) {
        this.eventSerializer = serializer;
    }

    public void setRedisConnectionProvider(RedisConnectionProvider redisConnectionProvider) {
        this.redisConnectionProvider = redisConnectionProvider;
    }
}
TOP

Related Classes of org.axonframework.eventstore.redis.RedisEventStore

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.