2020import org .apache .kafka .common .utils .Time ;
2121import org .apache .kafka .common .utils .Utils ;
2222import org .apache .kafka .connect .runtime .Connect ;
23+ import org .apache .kafka .connect .runtime .HerderProvider ;
2324import org .apache .kafka .connect .runtime .Worker ;
2425import org .apache .kafka .connect .runtime .WorkerConfigTransformer ;
2526import org .apache .kafka .connect .runtime .WorkerInfo ;
3839import org .slf4j .LoggerFactory ;
3940
4041import java .net .URI ;
42+ import java .util .Arrays ;
4143import java .util .Collections ;
4244import java .util .Map ;
4345
5355public class ConnectDistributed {
5456 private static final Logger log = LoggerFactory .getLogger (ConnectDistributed .class );
5557
56- public static void main (String [] args ) throws Exception {
57- if (args .length < 1 ) {
58+ private final Time time = Time .SYSTEM ;
59+ private final long initStart = time .hiResClockMs ();
60+
61+ public static void main (String [] args ) {
62+
63+ if (args .length < 1 || Arrays .asList (args ).contains ("--help" )) {
5864 log .info ("Usage: ConnectDistributed worker.properties" );
5965 Exit .exit (1 );
6066 }
6167
6268 try {
63- Time time = Time .SYSTEM ;
64- log .info ("Kafka Connect distributed worker initializing ..." );
65- long initStart = time .hiResClockMs ();
6669 WorkerInfo initInfo = new WorkerInfo ();
6770 initInfo .logAll ();
6871
6972 String workerPropsFile = args [0 ];
7073 Map <String , String > workerProps = !workerPropsFile .isEmpty () ?
71- Utils .propsToStringMap (Utils .loadProps (workerPropsFile )) : Collections .<String , String >emptyMap ();
72-
73- log .info ("Scanning for plugin classes. This might take a moment ..." );
74- Plugins plugins = new Plugins (workerProps );
75- plugins .compareAndSwapWithDelegatingLoader ();
76- DistributedConfig config = new DistributedConfig (workerProps );
77-
78- String kafkaClusterId = ConnectUtils .lookupKafkaClusterId (config );
79- log .debug ("Kafka cluster ID: {}" , kafkaClusterId );
80-
81- RestServer rest = new RestServer (config );
82- URI advertisedUrl = rest .advertisedUrl ();
83- String workerId = advertisedUrl .getHost () + ":" + advertisedUrl .getPort ();
84-
85- KafkaOffsetBackingStore offsetBackingStore = new KafkaOffsetBackingStore ();
86- offsetBackingStore .configure (config );
87-
88- Worker worker = new Worker (workerId , time , plugins , config , offsetBackingStore );
89- WorkerConfigTransformer configTransformer = worker .configTransformer ();
90-
91- Converter internalValueConverter = worker .getInternalValueConverter ();
92- StatusBackingStore statusBackingStore = new KafkaStatusBackingStore (time , internalValueConverter );
93- statusBackingStore .configure (config );
94-
95- ConfigBackingStore configBackingStore = new KafkaConfigBackingStore (
96- internalValueConverter ,
97- config ,
98- configTransformer );
99-
100- DistributedHerder herder = new DistributedHerder (config , time , worker ,
101- kafkaClusterId , statusBackingStore , configBackingStore ,
102- advertisedUrl .toString ());
103- final Connect connect = new Connect (herder , rest );
104- log .info ("Kafka Connect distributed worker initialization took {}ms" , time .hiResClockMs () - initStart );
105- try {
106- connect .start ();
107- } catch (Exception e ) {
108- log .error ("Failed to start Connect" , e );
109- connect .stop ();
110- Exit .exit (3 );
111- }
74+ Utils .propsToStringMap (Utils .loadProps (workerPropsFile )) : Collections .emptyMap ();
75+
76+ ConnectDistributed connectDistributed = new ConnectDistributed ();
77+ Connect connect = connectDistributed .startConnect (workerProps );
11278
11379 // Shutdown will be triggered by Ctrl-C or via HTTP shutdown request
11480 connect .awaitStop ();
@@ -118,4 +84,55 @@ public static void main(String[] args) throws Exception {
11884 Exit .exit (2 );
11985 }
12086 }
87+
88+ public Connect startConnect (Map <String , String > workerProps ) {
89+ log .info ("Scanning for plugin classes. This might take a moment ..." );
90+ Plugins plugins = new Plugins (workerProps );
91+ plugins .compareAndSwapWithDelegatingLoader ();
92+ DistributedConfig config = new DistributedConfig (workerProps );
93+
94+ String kafkaClusterId = ConnectUtils .lookupKafkaClusterId (config );
95+ log .debug ("Kafka cluster ID: {}" , kafkaClusterId );
96+
97+ RestServer rest = new RestServer (config );
98+ HerderProvider provider = new HerderProvider ();
99+ rest .start (provider , plugins );
100+
101+ URI advertisedUrl = rest .advertisedUrl ();
102+ String workerId = advertisedUrl .getHost () + ":" + advertisedUrl .getPort ();
103+
104+ KafkaOffsetBackingStore offsetBackingStore = new KafkaOffsetBackingStore ();
105+ offsetBackingStore .configure (config );
106+
107+ Worker worker = new Worker (workerId , time , plugins , config , offsetBackingStore );
108+ WorkerConfigTransformer configTransformer = worker .configTransformer ();
109+
110+ Converter internalValueConverter = worker .getInternalValueConverter ();
111+ StatusBackingStore statusBackingStore = new KafkaStatusBackingStore (time , internalValueConverter );
112+ statusBackingStore .configure (config );
113+
114+ ConfigBackingStore configBackingStore = new KafkaConfigBackingStore (
115+ internalValueConverter ,
116+ config ,
117+ configTransformer );
118+
119+ DistributedHerder herder = new DistributedHerder (config , time , worker ,
120+ kafkaClusterId , statusBackingStore , configBackingStore ,
121+ advertisedUrl .toString ());
122+
123+ final Connect connect = new Connect (herder , rest );
124+ log .info ("Kafka Connect distributed worker initialization took {}ms" , time .hiResClockMs () - initStart );
125+ try {
126+ connect .start ();
127+ // herder has initialized now, and ready to be used by the RestServer.
128+ provider .setHerder (herder );
129+ } catch (Exception e ) {
130+ log .error ("Failed to start Connect" , e );
131+ connect .stop ();
132+ Exit .exit (3 );
133+ }
134+
135+ return connect ;
136+ }
137+
121138}
0 commit comments