static <T> StreamMessage<T> concat(Iterable<? extends Publisher<? extends T>> publishers) {
        requireNonNull(publishers, "publishers");

        if (Iterables.isEmpty(publishers)) {
            return of();
        }
        final List<StreamMessage<? extends T>> streamMessages = ImmutableList.copyOf(publishers)
                                                                             .stream()
                                                                             .map(StreamMessage::of)
                                                                             .collect(toImmutableList());
        return new ConcatArrayStreamMessage<>(streamMessages);
    }
Returns a concatenated {@link StreamMessage} which relays items of the specified {@link Publisher}s
in order, non-overlappingly, one after the other finishes.
core/src/main/java/com/linecorp/armeria/common/stream/StreamMessage.java