2016-04-08 2 views
1

Я работаю над приложением Sinatra-JRuby и обрабатываю ситуацию, когда параллельные вызовы API поступают на уровень API, а затем обрабатываются с помощью уровня сервиса и адаптера. У меня есть модуль GlobalService для обмена общей информацией, поэтому я могу получить доступ к этой общей информации из любого другого уровня. Это работает отлично, пока не появятся совпадающие вызовы и сбросьте значение предыдущего API. Хотя я применил Mutex для решения этой проблемы, но у меня есть ощущение, что это неправильный подход к проблеме. Вот что я реализовал:Параллелизм в JRuby

require 'thread' 

module GlobalService 
    @@mutex = Mutex.new 

    def self.set_header(auth_subject, transaction_id) 
     @@mutex.synchronize { 
      @auth_subject = auth_subject 
      @transaction_id = transaction_id 
     } 
    end 

    def self.get_header 
     @@mutex.synchronize { 
      return @auth_subject, @transaction_id 
     } 
    end 
end 

Сообщите мне о любом альтернативном решении проблемы.

ответ

0

Обмен памятью никогда не будет действительно безопасным потоком, поэтому вам может быть полезно использовать стратегию передачи сообщений. Мое предпочтение этому было бы создать актеров и заставить их общаться о смене государства. Посмотрите, что такое актеры Concurrent Ruby's http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Actor.html.

Вы могли бы сделать что-то вроде

require 'concurrent' 

class GlobalService < Concurrent::Actor::Context 

    def initialize(auth_subject, transaction_id) 
    @auth_subject = auth_subject 
    @transaction_id = transaction_id 
    end 

    def on_message(message) 
    #some logic 
    @auth_subject = message.auth_subject 
    @transaction_id = message.transaction_id 
    end 
end 

сервис = GlobalService.spawn (: первый, "заголовок ...", ид) и т.д ...

Я использовал эту стратегию в прошлое, и это получилось достаточно хорошо. Вы также можете обратиться за помощью в https://gitter.im/ruby-concurrency/concurrent-ruby Pitrch обычно очень полезен!

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

  • Нет связанных вопросов^_^