出于无趣的原因,我不得不在我们还想使用 Amazon Simple Workflow (SWF) 的特定项目中使用 jRuby。我在 jRuby 部门别无选择,所以请不要说“使用 MRI”。
我遇到的第一个问题是 jRuby 不支持分叉,而 SWF 活动工作者喜欢分叉。在破解了 SWF ruby 库之后,我能够弄清楚如何附加记录器并弄清楚如何防止分叉,这非常有帮助:
AWS::Flow::ActivityWorker.new(
swf.client, domain,"my_tasklist", MyActivities
) do |options|
options.logger= Logger.new("logs/swf_logger.log")
options.use_forking = false
end
这阻止了分叉,但现在我在 SWF 源代码中遇到了更多与 Fibers 相关的异常,并且上下文不存在:
Error in the poller, exception:
AWS::Flow::Core::NoContextException: AWS::Flow::Core::NoContextException stacktrace:
"aws-flow-2.4.0/lib/aws/flow/implementation.rb:38:in 'task'",
"aws-flow-2.4.0/lib/aws/decider/task_poller.rb:292:in 'respond_activity_task_failed'",
"aws-flow-2.4.0/lib/aws/decider/task_poller.rb:204:in 'respond_activity_task_failed_with_retry'",
"aws-flow-2.4.0/lib/aws/decider/task_poller.rb:335:in 'process_single_task'",
"aws-flow-2.4.0/lib/aws/decider/task_poller.rb:388:in 'poll_and_process_single_task'",
"aws-flow-2.4.0/lib/aws/decider/worker.rb:447:in 'run_once'",
"aws-flow-2.4.0/lib/aws/decider/worker.rb:419:in 'start'",
"org/jruby/RubyKernel.java:1501:in `loop'",
"aws-flow-2.4.0/lib/aws/decider/worker.rb:417:in 'start'",
"/Users/trcull/dev/etl/flow/etl_runner.rb:28:in 'start_workers'"
这是该行的 SWF 代码:
# @param [Future] future
# Unused; defaults to **nil**.
#
# @param block
# The block of code to be executed when the task is run.
#
# @raise [NoContextException]
# If the current fiber does not respond to `Fiber.__context__`.
#
# @return [Future]
# The tasks result, which is a {Future}.
#
def task(future = nil, &block)
fiber = ::Fiber.current
raise NoContextException unless fiber.respond_to? :__context__
context = fiber.__context__
t = Task.new(nil, &block)
task_context = TaskContext.new(:parent => context.get_closest_containing_scope, :task => t)
context << t
t.result
end
我担心这是同一个分叉问题的另一种形式,也担心我将面临漫长的 SWF 源代码和解决问题的道路,直到我最终遇到无法解决的问题。
所以,我的问题是,有没有人真正让 jRuby 和 SWF 一起工作?如果是这样,是否有我可以指出的步骤和解决方法列表?到目前为止,谷歌搜索“SWF 和 jRuby”还没有出现任何结果,我已经完成了 1 1/2 天的任务。