Logstash自定义输入插件来调用java类

时间:2016-12-29 09:36:54

标签: java ruby apache-kafka logstash logstash-configuration

我为logstash编写了一个自定义过滤器插件来调用java类。

要求:

输入插件:从队列中读取

自定义插件:对于队列中的每条消息,调用java类

    @Bean
    public JobLauncher simpleJobLauncher(JobRepository jobRepository){
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(jobRepository);
        jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
        return jobLauncher;
    }

问题: 有没有办法可以只实例化一次java类?对于我从队列中读取的每条消息,我都不想创建java类的新实例,而是在logstash启动期间实例化它,并为所有传入消息使用相同的对象。

2 个答案:

答案 0 :(得分:1)

是。这很容易做到。您可以在ruby类中创建一个实例变量来保存Java对象,并在ruby类的register方法中实例化该对象。在filter方法中,使用实例变量来访问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中的实例变量。

答案 1 :(得分:1)

另一种方法是使用Ruby Singleton类;

private Brush _tBackground;
public Brush TBackground
{
   get { return _tBackground; }
   set
   {
      _tBackground = value;
      NotifyPropertyChanged("TBackground");
   }
}

private int _tFontSize;
public int TFontSize
{
   get { return _tFontSize; }
   set
   {
      _tFontSize = value;
      NotifyPropertyChanged("TFontSize");
   }
}

您可以在初始化方法中执行您需要的操作,然后只需要您的类的所有实例重复调用它,而无需每次都初始化它。

更多信息,请访问:

1)Singleton Pattern

2)Ruby Singleton class documentation