toReactivePublisher(autoStartOnSubscribe) (#3657)
* Add `toReactivePublisher(autoStartOnSubscribe)` The `IntegrationFlowBuilder.toReactivePublisher()` returns a `Publisher<Message<?>>` which may be subscribed somewhere late in the application logic, e.g. when WebSocket (or RSocket) subscription is initiated by the external client. In between application context startup and that subscription moment, the `IntegrationFlow` must not try to produce messages since there is nothing to consumer them from the `Publisher<Message<?>>` side. One of the way is to have a source endpoint not started automatically and control its lifecycle from the point fo reactive subscription * Introduce an `IntegrationFlowBuilder.toReactivePublisher(boolean autoStartOnSubscribe)` to let the framework do a job for an `IntegrationFlow` lifecycle control. This way end-user doesn't need to know autowire a starting endpoint and use `doOnSubscribe()` and similar callbacks * Change `ConsumerEndpointFactoryBean` log message about a `FixedSubscriberChannel` to `INFO` since an `autoStartup = false` really does not have any effect and there is nothing for end-user to worry about. The `IntegrationFlow` knows nothing about each endpoint internals and cannot control which mark as `autoStartup = false` and which not * Fix languge in JavaDocs Co-authored-by: Gary Russell <grussell@vmware.com> Co-authored-by: Gary Russell <grussell@vmware.com>
Spring Integration

Code of Conduct
Please see our Code of conduct.
Reporting Security Vulnerabilities
Please see our Security policy.
Checking out and Building
To check out the project and build from the source, do the following:
git clone git://github.com/spring-projects/spring-integration.git
cd spring-integration
./gradlew clean test
or
./gradlew clean testAll
The latter runs additional tests (those annotated with @LongRunningIntegrationTest); it is a more thorough test but takes quite a lot longer to run.
The test results are captured in build/reports/tests/test (or .../testAll) under each module (in HTML format).
Add --continue to the command to perform a complete build, even if there are failing tests in some modules; otherwise the build will stop after the current module(s) being built are completed.
NOTE: While Spring Integration runs with Java SE 8 or higher, a Java 11 compiler is required to build the project.
To build and install jars into your local Maven cache:
./gradlew publishToMavenLocal
To build api Javadoc (results will be in build/api):
./gradlew api
To build the reference documentation (results will be in build/docs/asciidoc and build/docs/asciidocPdf):
./gradlew reference
To build complete distribution including -dist, -docs, and -schema zip files (results will be in build/distributions):
./gradlew dist
Using Eclipse or Spring Tool Suite (with BuildShip Plugin)
If you have the BuildShip plugin installed,
File -> Import -> Gradle -> Existing Gradle Project
Using Eclipse or Spring Tool Suite (when the BuildShip Plugin is not installed)
To generate Eclipse metadata (.classpath and .project files, etc), do the following:
./gradlew eclipse
Once complete, you may then import the projects into Eclipse as usual:
File -> Import -> General -> Existing projects into workspace
Browse to the 'spring-integration' root directory. All projects should import free of errors.
Using IntelliJ IDEA
To import the project into IntelliJ IDEA:
File -> Open... -> and select build.gradle from spring-integration project root directory
Guidelines
See also Contributor Guidelines.
Resources
For more information, please visit the Spring Integration website at: https://spring.io/projects/spring-integration