Skip to content

Instantly share code, notes, and snippets.

@jacaetevha
Created February 25, 2020 16:02
Show Gist options
  • Save jacaetevha/cb1f13c541e3cf70bab818547dadee11 to your computer and use it in GitHub Desktop.
Save jacaetevha/cb1f13c541e3cf70bab818547dadee11 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
mkdir -p common
mkdir -p app
mkdir -p config
mkdir -p bin
mkdir -p dist
cat <<RB > config/warble.rb
Warbler::Config.new do |config|
config.features = %w(gemjar)
config.dirs = %w[common app].select { |e| File.directory? e }
config.includes = FileList['bin/**']
config.jar_extension = 'jar'
config.autodeploy_dir = 'dist/'
config.bytecode_version = '1.8'
end
RB
cat <<RB > common/logger.rb
require 'logger'
class Logger
def self.verbose?
java.lang.Boolean.value_of(ENV_JAVA.fetch('DEBUG', ENV.fetch('DEBUG', 'false')))
end
def self.on(io_or_filename, verbose: verbose?)
Logger.new(
io_or_filename,
datetime_format: '%Y-%m-%d %H:%M:%S %z',
level: verbose ? Logger::DEBUG : Logger::INFO,
formatter: proc { |severity, datetime, _program_name, msg|
context = Thread.current.key?(:context) && !Thread.current[:context].nil? && !Thread.current[:context].empty? \
? "[#{Thread.current[:context]}] " \
: nil
"[#{datetime}] [#{severity}] [#{Process.pid}] #{context}#{msg}\n"
},
)
end
end
RB
cat <<RB > common/example_thread_context.rb
module ExampleThreadContext
def clear_thread_context
Thread.current[:context] = nil
end
def thread_context
Thread.current[:context] ||= {}
end
end
RB
cat <<RB > app/example.rb
require_relative '../common/example_thread_context'
LOGGER=Logger.on(STDOUT)
class Example
include ExampleThreadContext
def go(message:, **context)
thread_context.merge!(context)
LOGGER.info message
clear_thread_context
context.merge!(message: message)
end
class Task
include java.util.concurrent.Callable
def initialize(count, message)
@c = count
@m = message
end
def call
Example.new.go(message: @m, tid: @c)
end
end
end
RB
cat <<RB > bin/example
require_relative '../common/logger'
require_relative '../app/example'
message = ARGV[0] || "test message"
Example.new.go message: 'main thread'
es = java.util.concurrent.Executors.newFixedThreadPool 4
futures = (0...5).map do |count|
es.submit Example::Task.new(count + 1, message)
end
es.shutdown
pp futures.map(&:get)
RB
cat <<RB > Gemfile
source "https://rubygems.org"
gem 'jruby-jars', '~> 9.2', '= 9.2.8.0'
gem 'warbler', '2.0.5'
RB
which bundle > /dev/null
[[ "$?" != "0" ]] && gem install bundler
bundle info warbler > /dev/null
[[ "$?" != "0" ]] && bundle install --path=vendor
bundle exec warble
#!/usr/bin/env bash
[[ "$#" == "0" ]] && echo 'you need to pass at least one arg' && exit 1
for message in "$@"; do
java -jar dist/example.jar $message
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment