2016-12-29 2 views
1

Я написал специальный фильтр-плагин для logstash для вызова класса java.Плагин пользовательского ввода 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 и использовать один и тот же объект для всех входящих сообщений.

ответ

1

Да. Это довольно легко сделать. Вы можете создать переменную экземпляра в своем классе ruby, чтобы удержать объект Java и создать экземпляр этого метода register вашего класса ruby. В методе фильтра используйте переменную экземпляра для доступа к объекту java.

Ниже код должен работать на вас.

# 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 
    @object = Java::Com.test.Test.new 
    end # def register 

    public 
    def filter(event) 
     a = @object.readMessage(event.get("message")) 
     event.set("message",a) 
    filter_matched(event) 
    end # def filter 
end # class LogStash::Filters::Example 

Не забывайте использовать @ перед именем переменной, чтобы сделать его переменной экземпляра в Ruby.

+0

Спасибо. Ты спас мой день! – minion

1

Альтернативой может быть использование класса Ruby Singleton;

require 'singleton' 

class Logger 
    include Singleton 

    def initialize 
    @log = File.open("log.txt", "a") 
    end 

    def log(msg) 
    @log.puts(msg) 
    end 
end 

Logger.instance.log('message 2') 

Вы можете делать то, что вам нужно в методе инициализации, а затем просто все экземпляра класса вызвать его повторно без инициализации его каждый раз.

Более доступны по адресу:

1) Singleton Pattern

2) Ruby Singleton class documentation

Смежные вопросы