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

标签 java ruby apache-kafka logstash logstash-configuration

我为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 启动期间实例化它,并对所有传入消息使用相同的对象。

最佳答案

是的。这很容易做到。您可以在 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 中的实例变量。

关于java - Logstash自定义输入插件调用java类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41376870/

相关文章:

json - Rails 向请求添加额外的 JSON

apache-kafka - Grafana/prometheus 中没有 kafka 指标

java - 如何更换?从字符串中的右双引号生成?

java - 如何使用 Java 按字母顺序对链表进行排序?

java - 扩展或重写外部基类以添加随后也存在于外部子类中的功能

ruby-on-rails - 将符号数组传递给 Rails 的 `except()!` 方法

java - 如何以字符串格式从日期中只取年份?

ruby-on-rails - 如何使用 ERB 模板制作 If 内联

apache-kafka - 使用 Kerberos 从 Windows 连接到 Unix 上的 Kafka

docker - docker-compose 中的 Kafka Streams 需要很长时间进行分区分配