Priest Tomb



Logstash 插件(JRuby)-引入 jar 包并使用

1 写在前面

在写 Logstash 插件的过程中,借鉴和学习到一些 JRuby 的书写技巧,随手记录一下,仅供参考。


混入防转防爬防抄袭声明:本文《Logstash 插件(JRuby)-引入 jar 包并使用》首发且仅发布于没有名字的博客


2 引入 jar 包并使用

正因为 Logstash 插件使用的是 JRuby,所以可以引入一些方便的 jar 包配合使用。比如 logstash-output-jdbc 插件的实现,就是引入和加载 JDBC jar 包,就可以使用了。

在写过的一些插件中,用到了如 RocketMQ 客户端的功能,于是参考着这样实现了。

2.1 引入 RocketMQ jar 包

我的习惯是直接给插件加一个配置参数logstash_path,指引使用者自行配置其根路径,以找到存放外部 jar 包的路径。

def load_jar_files
  jarpath = logstash_path + "/vendor/jar/rocketmq/*.jar"
  @logger.info("RocketMq plugin required jar files are loadding... Jar files path: ", path: jarpath)

  jars = Dir[jarpath]
  raise LogStash::ConfigurationError, 'RocketMq plugin init error, no jars found! Please check the jar files path!' if jars.empty?

  jars.each do |jar|
    @logger.trace('RocketMq plugin loaded a jar: ', jar: jar)
    require jar
  end
end

2.2 使用 Java 类

在上述例子中,引入 RocketMQ 的客户端 jar 包后,就可以按 Java 中的使用方式,使用相应的类了,当然,语法还是 Ruby 的。

@producer = org.apache.rocketmq.client.producer.DefaultMQProducer.new(producer_group)
@producer.setNamesrvAddr(name_server_addr)
@producer.setVipChannelEnabled(use_vip_channel)
@producer.start
mq_message = org.apache.rocketmq.common.message.Message.new
mq_message.setTopic(topic)
mq_message.setTags(tag)
mq_message.setKeys(key)
java_body = java.lang.String.new(body)
mq_message.setBody(java_body.getBytes(org.apache.rocketmq.remoting.common.RemotingHelper::DEFAULT_CHARSET))
@producer.send(mq_message)