diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c441c008b..68f3f9f95 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -15,7 +15,7 @@ class ApplicationController < ActionController::Base :model_index_render skip_before_action :verify_authenticity_token - before_action :set_user, :session_update, :user_device_check, :cors_preflight_check + before_action :set_interface_handle, :set_user, :session_update, :user_device_check, :cors_preflight_check after_action :trigger_events, :http_log, :set_access_control_headers rescue_from StandardError, with: :server_error @@ -58,6 +58,10 @@ class ApplicationController < ActionController::Base private + def set_interface_handle + ApplicationHandleInfo.current = 'application_server' + end + # execute events def trigger_events Observer::Transaction.commit diff --git a/app/models/channel/email_parser.rb b/app/models/channel/email_parser.rb index afd7871ba..80e0b7e14 100644 --- a/app/models/channel/email_parser.rb +++ b/app/models/channel/email_parser.rb @@ -390,6 +390,8 @@ retrns end def _process(channel, msg) + + # parse email mail = parse(msg) # run postmaster pre filter @@ -410,7 +412,14 @@ retrns } # check ignore header - return true if mail[ 'x-zammad-ignore'.to_sym ] == 'true' || mail[ 'x-zammad-ignore'.to_sym ] == true + if mail[ 'x-zammad-ignore'.to_sym ] == 'true' || mail[ 'x-zammad-ignore'.to_sym ] == true + Rails.logger.info "ignored email with msgid '#{mail[:message_id]}' from '#{mail[:from]}' because of x-zammad-ignore header" + return true + end + + # set interface handle + original_interface_handle = ApplicationHandleInfo.current + ApplicationHandleInfo.current = "#{original_interface_handle}.postmaster" ticket = nil article = nil @@ -497,11 +506,9 @@ retrns set_attributes_by_x_headers(ticket, 'ticket', mail) # create ticket - ticket.save + ticket.save! end - # import mail - # set attributes article = Ticket::Article.new( ticket_id: ticket.id, @@ -521,7 +528,7 @@ retrns set_attributes_by_x_headers(article, 'article', mail) # create article - article.save + article.save! # store mail plain Store.add( @@ -546,6 +553,8 @@ retrns end end + ApplicationHandleInfo.current = original_interface_handle + # execute object transaction Observer::Transaction.commit @@ -617,8 +626,8 @@ retrns item_object[key] = mail[ header.to_sym ] end } - end + end # workaround to parse subjects with 2 different encodings correctly (e. g. quoted-printable see test/fixtures/mail9.box) diff --git a/app/models/channel/filter/database.rb b/app/models/channel/filter/database.rb index fae850f29..8b5e2ada9 100644 --- a/app/models/channel/filter/database.rb +++ b/app/models/channel/filter/database.rb @@ -8,7 +8,7 @@ module Channel::Filter::Database # process postmaster filter filters = PostmasterFilter.where( active: true, channel: 'email' ).order(:name, :created_at) filters.each { |filter| - Rails.logger.info " proccess filter #{filter.name} ..." + Rails.logger.info " process filter #{filter.name} ..." all_matches_ok = true min_one_rule_exists = false filter[:match].each { |key, meta| diff --git a/app/models/observer/ticket/article/communicate_email.rb b/app/models/observer/ticket/article/communicate_email.rb index 10a383eb6..78a2bfd27 100644 --- a/app/models/observer/ticket/article/communicate_email.rb +++ b/app/models/observer/ticket/article/communicate_email.rb @@ -8,7 +8,11 @@ class Observer::Ticket::Article::CommunicateEmail < ActiveRecord::Observer # return if we run import mode return if Setting.get('import_mode') - # if sender is customer, do not communication + # only do send email if article got created via application_server (e. g. not + # if article and sender type is set via *.postmaster) + return if ApplicationHandleInfo.current.split('.')[1] == 'postmaster' + + # if sender is customer, do not communicate sender = Ticket::Article::Sender.lookup(id: record.sender_id) return 1 if sender.nil? return 1 if sender['name'] == 'Customer' diff --git a/app/models/observer/ticket/article/communicate_email/background_job.rb b/app/models/observer/ticket/article/communicate_email/background_job.rb index aa1b21d03..571cd0b18 100644 --- a/app/models/observer/ticket/article/communicate_email/background_job.rb +++ b/app/models/observer/ticket/article/communicate_email/background_job.rb @@ -66,7 +66,7 @@ class Observer::Ticket::Article::CommunicateEmail::BackgroundJob record.preferences['delivery_status_message'] = nil record.preferences['delivery_status'] = 'success' record.preferences['delivery_status_date'] = Time.zone.now - record.save + record.save! # store mail plain Store.add( @@ -91,6 +91,8 @@ class Observer::Ticket::Article::CommunicateEmail::BackgroundJob recipient_list += record[key] } + Rails.logger.info "Send email to: '#{recipient_list}' (from #{record.from})" + return if recipient_list == '' History.add( diff --git a/app/models/observer/ticket/article/communicate_facebook.rb b/app/models/observer/ticket/article/communicate_facebook.rb index 73ad34211..5eec88079 100644 --- a/app/models/observer/ticket/article/communicate_facebook.rb +++ b/app/models/observer/ticket/article/communicate_facebook.rb @@ -10,7 +10,11 @@ class Observer::Ticket::Article::CommunicateFacebook < ActiveRecord::Observer # return if we run import mode return if Setting.get('import_mode') - # if sender is customer, do not communication + # only do send email if article got created via application_server (e. g. not + # if article and sender type is set via *.postmaster) + return if ApplicationHandleInfo.current.split('.')[1] == 'postmaster' + + # if sender is customer, do not communicate sender = Ticket::Article::Sender.lookup(id: record.sender_id) return 1 if sender.nil? return 1 if sender['name'] == 'Customer' diff --git a/app/models/observer/ticket/article/communicate_facebook/background_job.rb b/app/models/observer/ticket/article/communicate_facebook/background_job.rb index 5c53fab39..bdbe1d1dd 100644 --- a/app/models/observer/ticket/article/communicate_facebook/background_job.rb +++ b/app/models/observer/ticket/article/communicate_facebook/background_job.rb @@ -59,7 +59,11 @@ class Observer::Ticket::Article::CommunicateFacebook::BackgroundJob article.preferences['delivery_status'] = 'success' article.preferences['delivery_status_date'] = Time.zone.now - article.save + article.save! + + Rails.logger.info "Send facebook to: '#{article.to}' (from #{article.from})" + + article end def log_error(local_record, message) diff --git a/app/models/observer/ticket/article/communicate_twitter.rb b/app/models/observer/ticket/article/communicate_twitter.rb index c68ce42e9..8a4264fdc 100644 --- a/app/models/observer/ticket/article/communicate_twitter.rb +++ b/app/models/observer/ticket/article/communicate_twitter.rb @@ -8,7 +8,11 @@ class Observer::Ticket::Article::CommunicateTwitter < ActiveRecord::Observer # return if we run import mode return if Setting.get('import_mode') - # if sender is customer, do not communication + # only do send email if article got created via application_server (e. g. not + # if article and sender type is set via *.postmaster) + return if ApplicationHandleInfo.current.split('.')[1] == 'postmaster' + + # if sender is customer, do not communicate sender = Ticket::Article::Sender.lookup(id: record.sender_id) return if sender.nil? return if sender['name'] == 'Customer' diff --git a/app/models/observer/ticket/article/communicate_twitter/background_job.rb b/app/models/observer/ticket/article/communicate_twitter/background_job.rb index 6c99790cc..1b3e379e4 100644 --- a/app/models/observer/ticket/article/communicate_twitter/background_job.rb +++ b/app/models/observer/ticket/article/communicate_twitter/background_job.rb @@ -68,8 +68,11 @@ class Observer::Ticket::Article::CommunicateTwitter::BackgroundJob article.preferences['delivery_status_date'] = Time.zone.now article.message_id = tweet.id.to_s - article.save + article.save! + Rails.logger.info "Send twitter (#{tweet.class}) to: '#{article.to}' (from #{article.from})" + + article end def log_error(local_record, message) diff --git a/app/models/observer/ticket/article/fillup_from_email.rb b/app/models/observer/ticket/article/fillup_from_email.rb index d28fa108a..4090ca182 100644 --- a/app/models/observer/ticket/article/fillup_from_email.rb +++ b/app/models/observer/ticket/article/fillup_from_email.rb @@ -8,6 +8,10 @@ class Observer::Ticket::Article::FillupFromEmail < ActiveRecord::Observer # return if we run import mode return if Setting.get('import_mode') + # only do fill of email from if article got created via application_server (e. g. not + # if article and sender type is set via *.postmaster) + return if ApplicationHandleInfo.current.split('.')[1] == 'postmaster' + # if sender is customer, do not change anything sender = Ticket::Article::Sender.lookup(id: record.sender_id) return if sender.nil? diff --git a/app/models/observer/ticket/article/fillup_from_general.rb b/app/models/observer/ticket/article/fillup_from_general.rb index b54d20752..b509fc635 100644 --- a/app/models/observer/ticket/article/fillup_from_general.rb +++ b/app/models/observer/ticket/article/fillup_from_general.rb @@ -8,6 +8,10 @@ class Observer::Ticket::Article::FillupFromGeneral < ActiveRecord::Observer # return if we run import mode return if Setting.get('import_mode') + # only do fill of from if article got created via application_server (e. g. not + # if article and sender type is set via *.postmaster) + return if ApplicationHandleInfo.current.split('.')[1] == 'postmaster' + # if sender is customer, do not change anything sender = Ticket::Article::Sender.lookup(id: record.sender_id) return if sender.nil? diff --git a/app/models/observer/transaction.rb b/app/models/observer/transaction.rb index bd70ae487..aaeb36fec 100644 --- a/app/models/observer/transaction.rb +++ b/app/models/observer/transaction.rb @@ -5,11 +5,10 @@ class Observer::Transaction < ActiveRecord::Observer def self.commit(params = {}) - # add attribute if execution is via web - params[:via_web] = false - if ENV['RACK_ENV'] || Rails.configuration.webserver_is_active - params[:via_web] = true - end + # add attribute of interface handle (e. g. to send (no) notifications if a agent + # is creating a ticket via application_server, but send it if it's created via + # postmaster) + params[:interface_handle] = ApplicationHandleInfo.current # execute object transactions Observer::Transaction.perform(params) diff --git a/app/models/scheduler.rb b/app/models/scheduler.rb index 1f44b2257..560422b56 100644 --- a/app/models/scheduler.rb +++ b/app/models/scheduler.rb @@ -47,6 +47,7 @@ class Scheduler < ApplicationModel def self.start_job(job) Thread.new { + ApplicationHandleInfo.current = 'scheduler' logger.info "Started job thread for '#{job.name}' (#{job.method})..." @@ -118,8 +119,12 @@ class Scheduler < ApplicationModel # used for tests if foreground + original_interface_handle = ApplicationHandleInfo.current + ApplicationHandleInfo.current = 'scheduler' + original_user_id = UserInfo.current_user_id UserInfo.current_user_id = nil + loop do success, failure = Delayed::Worker.new.work_off if failure.nonzero? @@ -128,6 +133,7 @@ class Scheduler < ApplicationModel break if success.zero? end UserInfo.current_user_id = original_user_id + ApplicationHandleInfo.current = original_interface_handle return end @@ -139,6 +145,7 @@ class Scheduler < ApplicationModel logger.info "Starting worker thread #{Delayed::Job}" loop do + ApplicationHandleInfo.current = 'scheduler' result = nil realtime = Benchmark.realtime do diff --git a/app/models/transaction/background_job.rb b/app/models/transaction/background_job.rb index a70c2e874..761026866 100644 --- a/app/models/transaction/background_job.rb +++ b/app/models/transaction/background_job.rb @@ -8,7 +8,7 @@ class Transaction::BackgroundJob object: 'Ticket', type: 'update', ticket_id: 123, - via_web: true, + interface_handle: 'application_server', # application_server|websocket|scheduler changes: { 'attribute1' => [before,now], 'attribute2' => [before,now], diff --git a/app/models/transaction/cti_caller_id_detection.rb b/app/models/transaction/cti_caller_id_detection.rb index 692485dab..314cb735d 100644 --- a/app/models/transaction/cti_caller_id_detection.rb +++ b/app/models/transaction/cti_caller_id_detection.rb @@ -8,7 +8,7 @@ class Transaction::CtiCallerIdDetection object: 'Ticket', type: 'create', object_id: 123, - via_web: true, + interface_handle: 'application_server', # application_server|websocket|scheduler user_id: 123, created_at: Time.zone.now, }, @@ -16,7 +16,7 @@ class Transaction::CtiCallerIdDetection object: 'User', type: 'update', object_id: 123, - via_web: true, + interface_handle: 'application_server', # application_server|websocket|scheduler changes: { 'attribute1' => [before, now], 'attribute2' => [before, now], diff --git a/app/models/transaction/karma.rb b/app/models/transaction/karma.rb index d41fec07f..fab593f32 100644 --- a/app/models/transaction/karma.rb +++ b/app/models/transaction/karma.rb @@ -7,7 +7,7 @@ class Transaction::Karma object: 'Ticket', type: 'update', object_id: 123, - via_web: true, + interface_handle: 'application_server', # application_server|websocket|scheduler changes: { 'attribute1' => [before, now], 'attribute2' => [before, now], diff --git a/app/models/transaction/notification.rb b/app/models/transaction/notification.rb index e7ee25062..09e90e4d5 100644 --- a/app/models/transaction/notification.rb +++ b/app/models/transaction/notification.rb @@ -7,7 +7,7 @@ class Transaction::Notification object: 'Ticket', type: 'update', object_id: 123, - via_web: true, + interface_handle: 'application_server', # application_server|websocket|scheduler changes: { 'attribute1' => [before, now], 'attribute2' => [before, now], @@ -95,7 +95,7 @@ class Transaction::Notification channels = item[:channels] # ignore user who changed it by him self via web - if @params[:via_web] + if @params[:interface_handle] == 'application_server' next if article && article.updated_by_id == user.id next if !article && @item[:user_id] == user.id end diff --git a/app/models/transaction/signature_detection.rb b/app/models/transaction/signature_detection.rb index 2e362b35f..b2aac65c1 100644 --- a/app/models/transaction/signature_detection.rb +++ b/app/models/transaction/signature_detection.rb @@ -8,7 +8,7 @@ class Transaction::SignatureDetection object: 'Ticket', type: 'update', object_id: 123, - via_web: true, + interface_handle: 'application_server', # application_server|websocket|scheduler changes: { 'attribute1' => [before, now], 'attribute2' => [before, now], diff --git a/app/models/transaction/slack.rb b/app/models/transaction/slack.rb index 27e28ef47..bf4b630b1 100644 --- a/app/models/transaction/slack.rb +++ b/app/models/transaction/slack.rb @@ -1,30 +1,25 @@ # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/ class Transaction::Slack + =begin -backend = Transaction::Slack.new( - object: 'Ticket', - type: 'create', - object_id: 1, - user_id: 123, - created_at: Time.zone.now, -) -backend.perform - - { + backend = Transaction::Slack.new( object: 'Ticket', type: 'update', object_id: 123, - via_web: true, + interface_handle: 'application_server', # application_server|websocket|scheduler changes: { 'attribute1' => [before, now], 'attribute2' => [before, now], }, created_at: Time.zone.now, user_id: 123, - }, + ) + backend.perform + =end + def initialize(item, params = {}) @item = item @params = params diff --git a/app/models/transaction/trigger.rb b/app/models/transaction/trigger.rb index 524b8ab81..620d6cd96 100644 --- a/app/models/transaction/trigger.rb +++ b/app/models/transaction/trigger.rb @@ -7,7 +7,7 @@ class Transaction::Trigger object: 'Ticket', type: 'update', object_id: 123, - via_web: true, + interface_handle: 'application_server', # application_server|websocket|scheduler changes: { 'attribute1' => [before, now], 'attribute2' => [before, now], diff --git a/config/initializers/web_server.rb b/config/initializers/web_server.rb deleted file mode 100644 index c442d9d93..000000000 --- a/config/initializers/web_server.rb +++ /dev/null @@ -1,2 +0,0 @@ - -Rails.configuration.webserver_is_active = false diff --git a/lib/application_handle_info.rb b/lib/application_handle_info.rb new file mode 100644 index 000000000..854a9d8b4 --- /dev/null +++ b/lib/application_handle_info.rb @@ -0,0 +1,9 @@ +module ApplicationHandleInfo + def self.current + Thread.current[:application_handle] || 'unknown' + end + + def self.current=(name) + Thread.current[:application_handle] = name + end +end diff --git a/lib/search_index_backend.rb b/lib/search_index_backend.rb index 32dfd96c2..76e4f7d1c 100644 --- a/lib/search_index_backend.rb +++ b/lib/search_index_backend.rb @@ -59,7 +59,7 @@ create/update/delete index ) Rails.logger.info "# #{response.code}" return true if response.success? - raise "Unable to proccess PUT at #{url}\n#{response.inspect}" + raise "Unable to process PUT at #{url}\n#{response.inspect}" end =begin @@ -91,7 +91,7 @@ add new object to search index ) Rails.logger.info "# #{response.code}" return true if response.success? - raise "Unable to proccess POST at #{url} (size: #{data.to_json.bytesize / 1024 / 1024}M)\n#{response.inspect}" + raise "Unable to process POST at #{url} (size: #{data.to_json.bytesize / 1024 / 1024}M)\n#{response.inspect}" end =begin @@ -321,7 +321,7 @@ get count of tickets and tickets which match on selector Rails.logger.info "# #{response.code}" if !response.success? - raise "Unable to proccess POST at #{url}\n#{response.inspect}" + raise "Unable to process POST at #{url}\n#{response.inspect}" end Rails.logger.debug response.data.to_json diff --git a/script/websocket-server.rb b/script/websocket-server.rb index 87b4c5a7b..d9e693f24 100755 --- a/script/websocket-server.rb +++ b/script/websocket-server.rb @@ -95,6 +95,7 @@ if ARGV[0] == 'start' && @options[:d] end @clients = {} +Rails.configuration.interface = 'websocket' EventMachine.run { EventMachine::WebSocket.start( host: @options[:b], port: @options[:p], secure: @options[:s], tls_options: tls_options ) do |ws| diff --git a/test/test_helper.rb b/test/test_helper.rb index 57e468cab..497dc0870 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -42,6 +42,9 @@ class ActiveSupport::TestCase # set current user UserInfo.current_user_id = nil + # set interface handle + ApplicationHandleInfo.current = 'unknown' + Rails.logger.info '++++NEW++++TEST++++' end @@ -64,4 +67,22 @@ class ActiveSupport::TestCase count end + def email_count(recipient) + + # read config file and count & recipients + file = "#{Rails.root}/log/#{Rails.env}.log" + lines = [] + IO.foreach(file) do |line| + lines.push line + end + count = 0 + lines.reverse.each { |line| + break if line =~ /\+\+\+\+NEW\+\+\+\+TEST\+\+\+\+/ + next if line !~ /Send email to:/ + next if line !~ /to:\s'#{recipient}'/ + count += 1 + } + count + end + end diff --git a/test/unit/online_notifiaction_test.rb b/test/unit/online_notifiaction_test.rb index ba6f9d8a4..b5106c40b 100644 --- a/test/unit/online_notifiaction_test.rb +++ b/test/unit/online_notifiaction_test.rb @@ -42,7 +42,7 @@ class OnlineNotificationTest < ActiveSupport::TestCase test 'ticket notification' do - Rails.configuration.webserver_is_active = true + ApplicationHandleInfo.current = 'application_server' # case #1 ticket1 = Ticket.create( @@ -381,7 +381,7 @@ class OnlineNotificationTest < ActiveSupport::TestCase updated_by_id: 1, created_by_id: 1, ) - assert( ticket1, 'ticket created' ) + assert(ticket1, 'ticket created') article_inbound = Ticket::Article.create( ticket_id: ticket1.id, from: 'some_sender@example.com', diff --git a/test/unit/ticket_notification_test.rb b/test/unit/ticket_notification_test.rb index 8fc36d49d..9b1199140 100644 --- a/test/unit/ticket_notification_test.rb +++ b/test/unit/ticket_notification_test.rb @@ -109,6 +109,7 @@ class TicketNotificationTest < ActiveSupport::TestCase test 'ticket notification - to all agents / to explicit agents' do # create ticket in group + ApplicationHandleInfo.current = 'scheduler.postmaster' ticket1 = Ticket.create( title: 'some notification test 1', group: Group.lookup(name: 'TicketNotificationTest'), @@ -134,7 +135,6 @@ class TicketNotificationTest < ActiveSupport::TestCase assert(ticket1) # execute object transaction - Rails.configuration.webserver_is_active = nil Observer::Transaction.commit Scheduler.worker(true) @@ -143,6 +143,7 @@ class TicketNotificationTest < ActiveSupport::TestCase assert_equal(1, NotificationFactory::Mailer.already_sent?(ticket1, agent2, 'email'), ticket1.id) # create ticket in group + ApplicationHandleInfo.current = 'application_server' ticket1 = Ticket.create( title: 'some notification test 2', group: Group.lookup(name: 'TicketNotificationTest'), @@ -168,7 +169,6 @@ class TicketNotificationTest < ActiveSupport::TestCase assert(ticket1) # execute object transaction - Rails.configuration.webserver_is_active = true Observer::Transaction.commit Scheduler.worker(true) @@ -180,6 +180,7 @@ class TicketNotificationTest < ActiveSupport::TestCase test 'ticket notification - simple' do # create ticket in group + ApplicationHandleInfo.current = 'application_server' ticket1 = Ticket.create( title: 'some notification test 3', group: Group.lookup(name: 'TicketNotificationTest'), @@ -205,7 +206,6 @@ class TicketNotificationTest < ActiveSupport::TestCase assert(ticket1, 'ticket created - ticket notification simple') # execute object transaction - Rails.configuration.webserver_is_active = true Observer::Transaction.commit Scheduler.worker(true) @@ -474,6 +474,7 @@ class TicketNotificationTest < ActiveSupport::TestCase agent2.save # create ticket in group + ApplicationHandleInfo.current = 'scheduler.postmaster' ticket1 = Ticket.create( title: 'some notification test - z preferences tests 1', group: Group.lookup(name: 'TicketNotificationTest'), @@ -498,7 +499,6 @@ class TicketNotificationTest < ActiveSupport::TestCase ) # execute object transaction - Rails.configuration.webserver_is_active = false Observer::Transaction.commit Scheduler.worker(true) @@ -630,6 +630,7 @@ class TicketNotificationTest < ActiveSupport::TestCase agent2.save # create ticket in group + ApplicationHandleInfo.current = 'scheduler.postmaster' ticket4 = Ticket.create( title: 'some notification test - z preferences tests 4', group: Group.lookup(name: 'TicketNotificationTest'), @@ -654,7 +655,6 @@ class TicketNotificationTest < ActiveSupport::TestCase ) # execute object transaction - Rails.configuration.webserver_is_active = false Observer::Transaction.commit Scheduler.worker(true) @@ -694,6 +694,7 @@ class TicketNotificationTest < ActiveSupport::TestCase agent2.save # create ticket in group + ApplicationHandleInfo.current = 'scheduler.postmaster' ticket5 = Ticket.create( title: 'some notification test - z preferences tests 5', group: Group.lookup(name: 'TicketNotificationTest'), @@ -718,7 +719,6 @@ class TicketNotificationTest < ActiveSupport::TestCase ) # execute object transaction - Rails.configuration.webserver_is_active = false Observer::Transaction.commit Scheduler.worker(true) @@ -758,6 +758,7 @@ class TicketNotificationTest < ActiveSupport::TestCase agent2.save # create ticket in group + ApplicationHandleInfo.current = 'scheduler.postmaster' ticket6 = Ticket.create( title: 'some notification test - z preferences tests 6', group: Group.lookup(name: 'TicketNotificationTest'), @@ -783,7 +784,6 @@ class TicketNotificationTest < ActiveSupport::TestCase ) # execute object transaction - Rails.configuration.webserver_is_active = false Observer::Transaction.commit Scheduler.worker(true) @@ -835,6 +835,7 @@ class TicketNotificationTest < ActiveSupport::TestCase agent2.save # create ticket in group + ApplicationHandleInfo.current = 'scheduler.postmaster' ticket7 = Ticket.create( title: 'some notification test - z preferences tests 7', group: Group.lookup(name: 'TicketNotificationTest'), @@ -860,7 +861,6 @@ class TicketNotificationTest < ActiveSupport::TestCase ) # execute object transaction - Rails.configuration.webserver_is_active = false Observer::Transaction.commit Scheduler.worker(true)