Tag Archives: Groovy

Sample #Kafka producer with #Groovy

Here is a brief example of Kafka producer client written in Groovy:

import org.apache.kafka.clients.producer.Callback
import org.apache.kafka.clients.producer.KafkaProducer
import org.apache.kafka.clients.producer.ProducerRecord
import org.apache.kafka.clients.producer.RecordMetadata
 
@Grab(group = "org.apache.kafka", module = "kafka-clients", version = "0.8.2.0")
@Grab(group = 'ch.qos.logback', module = 'logback-classic', version = '1.1.2')
 
Properties props = new Properties()
props.put('zk.connect', '192.168.56.71:2181')
props.put('bootstrap.servers', '192.168.56.71:9092,192.168.56.71:9093,192.168.56.71:9094')
props.put('key.serializer', 'org.apache.kafka.common.serialization.StringSerializer')
props.put('value.serializer', 'org.apache.kafka.common.serialization.StringSerializer')
 
def producer = new KafkaProducer(props)
 
def messageSender = { String topic, String message ->
    String key = new Random().nextLong()
    String compoundMessage = "key: $key, message: $message"
    producer.send(
            new ProducerRecord<String, String>(topic, key, compoundMessage),
            { RecordMetadata metadata, Exception e ->
                println "The offset of the record we just sent is: ${metadata.offset()}"
            } as Callback
    )
}
args.each { arg ->
    println "sending message $arg"
    messageSender('simple.topic', arg)
}
producer.close()

In order to run it use:

groovy -Dgroovy.grape.report.downloads=true producer.groovy hello from Groovy client

#JavaDayKiev 2013 interesting topics

This fall is quite rich for upcoming event in software engineering industry in Kyiv. One more interesting conference is JavaDay 2013.

And here is a list of interest topics I’d like to visit:

By the way this year I’m going to take active part in it  and here is my topic Groovy MOPping.

Hope to see you there.

* – even I have my session scheduled for the same time 😉

 

Groovy and noteworthy

There is a slide deck from my recent talk at JUG UA Aug 8th dedicated to Groovy.

Along with my talk there were additional topics related to Scala and Closure. More details could be found there “JVM-based languages: Scala, Clojure, Groovy” with video and presentations from other speakers. The main idea of this meeting was to demonstrate main concepts of JVM-based languages, what are specials, how to getting started.

It was really fun to have a talk, audience asked a lot of different questions and it was really dynamic and interactive conversation.

Thanks for coming, enjoy a deck and keep coding:)

Test multipart request in Grails

Прошло относительно немного времени с момента последнего поста и я уже нахожусь на родине :). Вторую часть повествования моего пребывания заграницей я продолжу в следующий раз, а сегодня хочу поделиться одним незатейливым решением одной небольшой проблемы.

И так, немного вводной информации – на данный момент происходит мое знакомство с Grails методом написания демо-проекта. И в одной из задач проекта была реализация возможности загружать файлы, а именно изображения на сервер. Сам процесс загрузки собственно не сложен, а как и все в Grails, очень прост. Возможность загрузки файлов обеспечивается с помошью установки аттрибута формы enctype в виде:

<g:form action="save" enctype="multipart/form-data">
...
</g:form>

Либо следующим образом, разница только в том, что enctype уже “multipart/form-data”

<g:uploadForm action="save">
...
</g:uploadForm >

А в котроллере файл можно получить следующим образом:

def multipartFile = request.getFile('file')

где “file” – имя параметра из запроса, далее с этим объектом можно работать как со стандартным http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/multipart/MultipartFile.html.

Но собственно вернемся к проблеме, которая заключается в тест ировании загрузки файла на сервер. Как оказалось моковый объект запроса в контроллере не поддерживает multipart запросы.

К счастью, Groovy распологает возможностью динамически расширять возможности объекта в режиме выполнения. Это обеспечивается с помошью Mixin. Таким образом с помошью следующей конструкции я могу расширить возможности стандартного мокового объекта запроса:

....
def controller = new SomeController()
def imageMultipartFile = new MockMultipartFile("file", "test_image.jpg", "image/jpg", file.readBytes())
//add multipart nature to the mock request
controller.request.metaClass.mixin MockMultipartHttpServletRequest
controller.request.addFile(imageMultipartFile)
....

Собственно на этом все, проблема с невозможностью протестировать загрузку файла решена. Спасибо за внимание и удачного тестирования.