我已经为logstash编写了一个定制的过滤器插件来调用java类。
要求:
输入插件:从队列读取
自定义插件:为队列中的每条消息调用java类
**Code:**
# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"
require "java"
require "test.jar"
class LogStash::Filters::Example < LogStash::Filters::Base
config_name "example"
public
def register
end # def register
public
def filter(event)
object = Java::Com.test.Test.new
a = object.readMessage(event.get("message"))
event.set("message",a)
filter_matched(event)
end # def filter
end # class LogStash::Filters::Example
问题:有没有一种方法可以只示例化java类一次?对于从队列中读取的每条消息,我不想创建java类的新示例,而是在logstash启动期间示例化它,并对所有传入消息使用相同的对象。
2条答案
按热度按时间u3r8eeie1#
对。这很容易做到。您可以在ruby类中创建一个示例变量来保存java对象,并在
register
ruby类的方法。在filter方法中,使用instance变量访问java对象。下面的代码应该适合你。
记住使用
@
在变量名之前,使其成为ruby中的示例变量。6l7fqoea2#
另一种选择是使用ruby singleton类;
您可以在initialize方法中执行所需的操作,然后只调用类的所有示例来重复调用它,而不必每次都初始化它。
更多信息请访问:
1) 单子模式
2) ruby单例类文档