@@ -7,11 +7,15 @@ local ConsumerConfig = {}
77
88ConsumerConfig .__index = ConsumerConfig
99
10- function ConsumerConfig .create (brokers_list )
10+ function ConsumerConfig .create (brokers_list , consumer_group , enable_auto_commit )
1111 assert (brokers_list ~= nil )
12+ assert (consumer_group ~= nil )
13+ assert (enable_auto_commit ~= nil )
1214
1315 local config = {
1416 _brokers_list = brokers_list ,
17+ _consumer_group = consumer_group ,
18+ _enable_auto_commit = enable_auto_commit ,
1519 _options = {},
1620 }
1721 setmetatable (config , ConsumerConfig )
@@ -22,6 +26,14 @@ function ConsumerConfig:get_brokers_list()
2226 return self ._brokers_list
2327end
2428
29+ function ConsumerConfig :get_consumer_group ()
30+ return self ._consumer_group
31+ end
32+
33+ function ConsumerConfig :get_enable_auto_commit ()
34+ return self ._enable_auto_commit
35+ end
36+
2537function ConsumerConfig :set_option (name , value )
2638 self ._options [name ] = value
2739end
@@ -42,7 +54,7 @@ function ConsumerMessage.create(rd_message)
4254 _partition = nil ,
4355 _offset = nil ,
4456 }
45- ffi .gc (msg , function (...)
57+ ffi .gc (msg . _rd_message , function (...)
4658 librdkafka .rd_kafka_message_destroy (... )
4759 end )
4860 setmetatable (msg , ConsumerMessage )
@@ -102,24 +114,62 @@ function Consumer:_get_consumer_rd_config()
102114-- end)
103115
104116 local ERRLEN = 256
117+ local errbuf = ffi .new (" char[?]" , ERRLEN ) -- cdata objects are garbage collected
118+ if librdkafka .rd_kafka_conf_set (rd_config , " group.id" , tostring (self .config :get_consumer_group ()), errbuf , ERRLEN ) ~= librdkafka .RD_KAFKA_CONF_OK then
119+ return nil , ffi .string (errbuf )
120+ end
121+
122+ local enable_auto_commit
123+ if self .config :get_enable_auto_commit () then
124+ enable_auto_commit = " true"
125+ else
126+ enable_auto_commit = " false"
127+ end
128+
129+ local ERRLEN = 256
130+ local errbuf = ffi .new (" char[?]" , ERRLEN ) -- cdata objects are garbage collected
131+ if librdkafka .rd_kafka_conf_set (rd_config , " enable.auto.commit" , enable_auto_commit , errbuf , ERRLEN ) ~= librdkafka .RD_KAFKA_CONF_OK then
132+ return nil , ffi .string (errbuf )
133+ end
134+
105135 for key , value in pairs (self .config :get_options ()) do
106136 local errbuf = ffi .new (" char[?]" , ERRLEN ) -- cdata objects are garbage collected
107137 if librdkafka .rd_kafka_conf_set (rd_config , key , tostring (value ), errbuf , ERRLEN ) ~= librdkafka .RD_KAFKA_CONF_OK then
108138 return nil , ffi .string (errbuf )
109139 end
110140 end
111141
142+ librdkafka .rd_kafka_conf_set_consume_cb (rd_config ,
143+ function (rkmessage )
144+ print (rkmessage )
145+ self ._output_ch :put (ConsumerMessage .create (rkmessage ))
146+ end )
147+
148+ librdkafka .rd_kafka_conf_set_error_cb (rd_config ,
149+ function (rk , err , reason )
150+ print (" error" , tonumber (err ), ffi .string (reason ))
151+ end )
152+
153+
154+ librdkafka .rd_kafka_conf_set_log_cb (rd_config ,
155+ function (rk , level , fac , buf )
156+ print (" log" , tonumber (level ), ffi .string (fac ), ffi .string (buf ))
157+ end )
158+
112159 return rd_config , nil
113160end
114161
115162function Consumer :_poll ()
116163 while true do
117- local rd_message = librdkafka .rd_kafka_consumer_poll (self ._rd_consumer , 1 )
118- if rd_message .err == librdkafka .RD_KAFKA_RESP_ERR_NO_ERROR then
119- self ._output_ch :put (ConsumerMessage .create (rd_message ))
120- else
121- fiber .yield ()
164+ librdkafka .rd_kafka_poll (self ._rd_consumer , 10 )
165+ local rd_message = librdkafka .rd_kafka_consumer_poll (self ._rd_consumer , 1000 )
166+ print (rd_message )
167+ if rd_message ~= nil and rd_message .err ~= librdkafka .RD_KAFKA_RESP_ERR_NO_ERROR then
168+ -- FIXME: properly log this
169+ print (ffi .string (librdkafka .rd_kafka_err2str (rd_message .err )))
122170 end
171+
172+ fiber .yield ()
123173 end
124174end
125175
@@ -134,13 +184,20 @@ function Consumer:start()
134184 local ERRLEN = 256
135185 local errbuf = ffi .new (" char[?]" , ERRLEN ) -- cdata objects are garbage collected
136186 local rd_consumer = librdkafka .rd_kafka_new (librdkafka .RD_KAFKA_CONSUMER , rd_config , errbuf , ERRLEN )
137-
138187 if rd_consumer == nil then
139188 return ffi .string (errbuf )
140189 end
141190
191+ -- redirect all events polling to rd_kafka_consumer_poll function
192+ local err = librdkafka .rd_kafka_poll_set_consumer (rd_consumer )
193+ if err ~= librdkafka .RD_KAFKA_RESP_ERR_NO_ERROR then
194+ return ffi .string (librdkafka .rd_kafka_err2str (err ))
195+ end
196+
142197 for _ , broker in ipairs (self .config :get_brokers_list ()) do
143- librdkafka .rd_kafka_brokers_add (rd_consumer , broker )
198+ if librdkafka .rd_kafka_brokers_add (rd_consumer , broker ) < 1 then
199+ return " no valid brokers specified"
200+ end
144201 end
145202
146203 self ._rd_consumer = rd_consumer
@@ -181,6 +238,8 @@ function Consumer:subscribe(topics)
181238
182239 local list = librdkafka .rd_kafka_topic_partition_list_new (# topics )
183240 for _ , topic in ipairs (topics ) do
241+ print (topic , librdkafka .RD_KAFKA_PARTITION_UA )
242+ -- librdkafka.rd_kafka_topic_partition_list_add(list, topic, librdkafka.RD_KAFKA_PARTITION_UA)
184243 librdkafka .rd_kafka_topic_partition_list_add (list , topic , 0 )
185244 end
186245
0 commit comments