All Downloads are FREE. Search and download functionalities are using the official Maven repository.

forklift.replay.ReplayESWriter Maven / Gradle / Ivy

package forklift.replay;

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.VersionType;
import org.elasticsearch.index.engine.VersionConflictEngineException;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.InetSocketAddress;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class ReplayESWriter extends ReplayStoreThread {
    private static final Logger log = LoggerFactory.getLogger(ReplayES.class);

    private final TransportClient client;

    public ReplayESWriter(String hostname) {
        this(hostname, 9300, "elasticsearch");
    }

    public ReplayESWriter(String hostname, int port, String clusterName) {
        final Settings settings = Settings.settingsBuilder()
                        .put("cluster.name", clusterName).build();

        this.client = TransportClient.builder()
            .settings(settings)
            .build()
            .addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress(hostname, port)));
    }

    @Override
    protected void poll(ReplayESWriterMsg t) {
        final String replayVersion = t.getFields().get("forklift-replay-version");
        if ("3".equals(replayVersion)) { // latest version
            String indexDate = t.getFields().get("first-processed-date");
            if (indexDate == null)
                indexDate = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
            final String index = "forklift-replay-" + indexDate;

            try {
                // Index the new information.
                client.prepareIndex(index, "log")
                    .setVersion(t.getVersion()).setVersionType(VersionType.EXTERNAL_GTE)
                    .setId(t.getId()).setSource(t.getFields()).execute().actionGet();
            } catch (VersionConflictEngineException expected) {
                log.debug("Newer replay message already exists", expected);
            }
        } else if ("2".equals(replayVersion) || replayVersion == null) { // older versions didn't have the replay version or didn't persist it with the message
            final String index = "forklift-replay-" + LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);

            // In order to ensure there is only one replay msg for a given id we have to clean the msg id from
            // any previously created indexes.
            try {
                final SearchResponse resp = client.prepareSearch("forklift-replay*").setTypes("log")
                    .setQuery(QueryBuilders.termQuery("_id", t.getId()))
                    .setFrom(0).setSize(50).setExplain(false)
                    .execute()
                    .actionGet();

                if (resp != null && resp.getHits() != null && resp.getHits().getHits() != null) {
                    for (SearchHit hit : resp.getHits().getHits()) {
                        if (!hit.getIndex().equals(index))
                            client.prepareDelete(hit.getIndex(), "log", t.getId()).execute().actionGet();
                    }
                }
            } catch (Exception e) {
                log.error("", e);
                log.error("Unable to search for old replay logs {}", t.getId());
            }

            try {
                // Index the new information.
                client.prepareIndex(index, "log")
                    .setVersion(t.getVersion()).setVersionType(VersionType.EXTERNAL_GTE)
                    .setId(t.getId()).setSource(t.getFields()).execute().actionGet();
            } catch (VersionConflictEngineException expected) {
                log.debug("Newer replay message already exists", expected);
            }
        } else {
            log.error("Unrecognized replay version: '{}' for message ID '{}' with fields '{}' ", replayVersion, t.getId(), t.getFields());
        }
    }

    public void shutdown() {
        if (client != null)
            client.close();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy