@@ -18,6 +18,8 @@ package org.apache.spark.streaming.kinesis
18
18
19
19
import java .util .UUID
20
20
21
+ import scala .util .control .NonFatal
22
+
21
23
import com .amazonaws .auth .{AWSCredentials , AWSCredentialsProvider , BasicAWSCredentials , DefaultAWSCredentialsProviderChain }
22
24
import com .amazonaws .services .kinesis .clientlibrary .interfaces .{IRecordProcessor , IRecordProcessorFactory }
23
25
import com .amazonaws .services .kinesis .clientlibrary .lib .worker .{InitialPositionInStream , KinesisClientLibConfiguration , Worker }
@@ -98,6 +100,9 @@ private[kinesis] class KinesisReceiver(
98
100
*/
99
101
private var worker : Worker = null
100
102
103
+ /** Thread running the worker */
104
+ private var workerThread : Thread = null
105
+
101
106
/**
102
107
* This is called when the KinesisReceiver starts and must be non-blocking.
103
108
* The KCL creates and manages the receiving/processing thread pool through Worker.run().
@@ -126,8 +131,19 @@ private[kinesis] class KinesisReceiver(
126
131
}
127
132
128
133
worker = new Worker (recordProcessorFactory, kinesisClientLibConfiguration)
129
- worker.run()
130
-
134
+ workerThread = new Thread () {
135
+ override def run (): Unit = {
136
+ try {
137
+ worker.run()
138
+ } catch {
139
+ case NonFatal (e) =>
140
+ restart(" Error running the KCL worker in Receiver" , e)
141
+ }
142
+ }
143
+ }
144
+ workerThread.setName(" Kinesis Receiver" )
145
+ workerThread.setDaemon(true )
146
+ workerThread.start()
131
147
logInfo(s " Started receiver with workerId $workerId" )
132
148
}
133
149
@@ -137,10 +153,14 @@ private[kinesis] class KinesisReceiver(
137
153
* The KCL will do its best to drain and checkpoint any in-flight records upon shutdown.
138
154
*/
139
155
override def onStop () {
140
- if (worker != null ) {
141
- worker.shutdown()
156
+ if (workerThread != null ) {
157
+ if (worker != null ) {
158
+ worker.shutdown()
159
+ worker = null
160
+ }
161
+ workerThread.join()
162
+ workerThread = null
142
163
logInfo(s " Stopped receiver for workerId $workerId" )
143
- worker = null
144
164
}
145
165
workerId = null
146
166
}
0 commit comments