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

io.nats.examples.chaosTestApp.ChaosTestApp Maven / Gradle / Ivy

// Copyright 2023 The NATS Authors
// 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 io.nats.examples.chaosTestApp;

import io.nats.client.Connection;
import io.nats.client.JetStreamManagement;
import io.nats.client.Nats;
import io.nats.client.Options;
import io.nats.client.api.StorageType;
import io.nats.client.api.StreamConfiguration;
import io.nats.client.api.StreamInfo;
import io.nats.examples.chaosTestApp.support.CommandLine;
import io.nats.examples.chaosTestApp.support.CommandLineConsumer;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class ChaosTestApp {

    public static final String APP_LABEL = "APP";

    public static String[] MANUAL_ARGS = (
//        "--servers nats://192.168.50.99:4222"
        "--servers nats://localhost:4222"
            + " --stream jchaos-stream"
            + " --subject jchaos-subject"
//            + " --runtime 3600 // 1 hour in seconds
            + " --screen left"
//            + " --work"
            + " --create"
//            + " --r3"
            + " --publish"
            + " --pubjitter 30"
//            + " --simple ephemeral,100,5000"
            + " --simple ordered 100 5000"
            + " --simple durable 100 5000" // space or commas work, the parser figures it out
            + " --fetch durable,100,5000"
            + " --push ordered"
            + " --push durable"
//            + " --logdir c:\\temp"
    ).split(" ");

    public static void main(String[] args) throws Exception {

        args = MANUAL_ARGS; // comment out for real command line

        CommandLine cmd = new CommandLine(args);
        Monitor monitor;

        try {
            Output.start(cmd);
            Output.controlMessage(APP_LABEL, cmd.toString().replace(" --", "    \n--"));
            CountDownLatch waiter = new CountDownLatch(1);

            Publisher publisher = null;
            List cons = null;

            if (cmd.create) {
                Options options = cmd.makeManagmentOptions();
                try (Connection nc = Nats.connect(options)) {
                    System.out.println(nc.getServerInfo());
                    JetStreamManagement jsm = nc.jetStreamManagement();
                    createOrReplaceStream(cmd, jsm);
                }
                catch (Exception e) {
                    Output.errorMessage(APP_LABEL, e.getMessage());
                }
            }

            if (!cmd.commandLineConsumers.isEmpty()) {
                cons = new ArrayList<>();
                for (CommandLineConsumer clc : cmd.commandLineConsumers) {
                    ConnectableConsumer con;
                    switch (clc.consumerType) {
                        case Push:
                            con = new PushConsumer(cmd, clc.consumerKind);
                            break;
                        case Simple:
                            con = new SimpleConsumer(cmd, clc.consumerKind, clc.batchSize, clc.expiresIn);
                            break;
                        case Fetch:
                            con = new SimpleFetchConsumer(cmd, clc.consumerKind, clc.batchSize, clc.expiresIn);
                            break;
                        default:
                            throw new IllegalArgumentException("Unsupported consumer type: " + clc.consumerType);
                    }
                    Output.controlMessage(APP_LABEL, con.label);
                    cons.add(con);
                }
            }

            if (cmd.publish) {
                publisher = new Publisher(cmd, cmd.pubjitter);
                Thread pubThread = new Thread(publisher);
                pubThread.start();
            }

            // just creating the stream?
            if (publisher == null && cons == null) {
                return;
            }

            monitor = new Monitor(cmd, publisher, cons);
            Thread monThread = new Thread(monitor);
            monThread.start();

            long runtime = cmd.runtime < 1 ? Long.MAX_VALUE : cmd.runtime;
            //noinspection ResultOfMethodCallIgnored
            waiter.await(runtime, TimeUnit.MILLISECONDS);
        }
        catch (Exception e) {
            //noinspection CallToPrintStackTrace
            e.printStackTrace();
        }
        finally {
            Output.dumpControl();
            System.exit(0);
        }
    }

    public static void createOrReplaceStream(CommandLine cmd, JetStreamManagement jsm) {
        try {
            jsm.deleteStream(cmd.stream);
        }
        catch (Exception ignore) {}
        try {
            StreamConfiguration sc = StreamConfiguration.builder()
                .name(cmd.stream)
                .storageType(StorageType.File)
                .subjects(cmd.subject)
                .replicas(cmd.r3 ? 3 : 1)
                .build();
            StreamInfo si = jsm.addStream(sc);
            Output.controlMessage(APP_LABEL, "Create Stream\n" + Output.formatted(si.getConfiguration()));
        }
        catch (Exception e) {
            Output.fatalMessage(APP_LABEL, "Failed creating stream: '" + cmd.stream + "' " + e);
            System.exit(-1);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy