activejob-google_cloud_pubsub 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/README.md +13 -3
- data/exe/activejob-google_cloud_pubsub-worker +11 -9
- data/lib/active_job/google_cloud_pubsub/adapter.rb +5 -7
- data/lib/active_job/google_cloud_pubsub/pubsub_extension.rb +21 -0
- data/lib/active_job/google_cloud_pubsub/version.rb +1 -1
- data/lib/active_job/google_cloud_pubsub/worker.rb +13 -16
- data/lib/activejob-google_cloud_pubsub.rb +1 -0
- metadata +3 -3
- data/lib/active_job/google_cloud_pubsub/naming.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c7e0c78787b37b8180943e0f4a6c4ea393a00bae
|
4
|
+
data.tar.gz: 651b28c7e58141252a34b9be2d550dbdd26fc1bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf2214ee8c25208dbfb4e2f03dea18550a010571bd321ae14421c4e3f5314dbc9aa5cc6c54fead51ce9febd371234a8e060cea07eb913596edc060f4969c3ff2
|
7
|
+
data.tar.gz: 7dbd633493e0f635bb29b07da2c8a35f941d80301194cb109e61189dd49ca05b9d68ce51f880497f22b1ae0ed3b709aa45508832691fa9a01a1c7b0a279212ed
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# ActiveJob::GoogleCloudPubsub
|
2
2
|
|
3
|
+
[![Build Status](https://travis-ci.org/ursm/activejob-google_cloud_pubsub.svg?branch=master)](https://travis-ci.org/ursm/activejob-google_cloud_pubsub)
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/activejob-google_cloud_pubsub.svg)](https://badge.fury.io/rb/activejob-google_cloud_pubsub)
|
5
|
+
|
3
6
|
Google Cloud Pub/Sub adapter and worker for ActiveJob
|
4
7
|
|
5
8
|
## Installation
|
@@ -58,10 +61,15 @@ If you hit the previous action, the job will be executed.
|
|
58
61
|
When passing options to the adapter, you need to create the object instead of a symbol.
|
59
62
|
|
60
63
|
``` ruby
|
61
|
-
Rails.application.config.active_job.queue_adapter = ActiveJob::QueueAdapters::GoogleCloudPubsubAdapter.new(
|
64
|
+
Rails.application.config.active_job.queue_adapter = ActiveJob::QueueAdapters::GoogleCloudPubsubAdapter.new(
|
65
|
+
pubsub: Google::Cloud::Pubsub.new(
|
66
|
+
project: 'MY-PROJECT-ID',
|
67
|
+
keyfile: 'path/to/keyfile.json'
|
68
|
+
)
|
69
|
+
)
|
62
70
|
```
|
63
71
|
|
64
|
-
|
72
|
+
Please see [`Google::Cloud::Pubsub.new`](http://googlecloudplatform.github.io/google-cloud-ruby/#/docs/google-cloud-pubsub/v0.23.2/google/cloud/pubsub?method=new-class) for details.
|
65
73
|
|
66
74
|
### Worker
|
67
75
|
|
@@ -95,7 +103,9 @@ Default: number of logical cores
|
|
95
103
|
|
96
104
|
#### `--project=PROJECT_ID`, `--keyfile=PATH`
|
97
105
|
|
98
|
-
Credentials of Google Cloud Platform. Please
|
106
|
+
Credentials of Google Cloud Platform. Please see [the document](https://github.com/GoogleCloudPlatform/google-cloud-ruby/blob/master/AUTHENTICATION.md) for details.
|
107
|
+
|
108
|
+
## Development
|
99
109
|
|
100
110
|
``` sh
|
101
111
|
$ bundle exec rake spec
|
@@ -6,17 +6,17 @@ require 'optparse/kwargs'
|
|
6
6
|
|
7
7
|
Version = ActiveJob::GoogleCloudPubsub::VERSION
|
8
8
|
|
9
|
-
|
9
|
+
opts = {
|
10
10
|
require: './config/environment'
|
11
11
|
}
|
12
12
|
|
13
|
-
|
13
|
+
parser = OptionParser.new
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
parser.on '--[no-]require=PATH' do |v|
|
16
|
+
opts[:require] = v
|
17
17
|
end
|
18
18
|
|
19
|
-
worker_args =
|
19
|
+
worker_args = parser.define_by_keywords(
|
20
20
|
{},
|
21
21
|
ActiveJob::GoogleCloudPubsub::Worker.instance_method(:initialize),
|
22
22
|
{
|
@@ -25,7 +25,7 @@ worker_args = opt.define_by_keywords(
|
|
25
25
|
}
|
26
26
|
)
|
27
27
|
|
28
|
-
pubsub_args =
|
28
|
+
pubsub_args = parser.define_by_keywords(
|
29
29
|
{},
|
30
30
|
Google::Cloud::Pubsub.method(:new),
|
31
31
|
{
|
@@ -34,8 +34,10 @@ pubsub_args = opt.define_by_keywords(
|
|
34
34
|
}
|
35
35
|
)
|
36
36
|
|
37
|
-
|
37
|
+
parser.parse ARGV
|
38
38
|
|
39
|
-
require
|
39
|
+
require opts[:require] if opts[:require]
|
40
40
|
|
41
|
-
|
41
|
+
pubsub = Google::Cloud::Pubsub.new(pubsub_args)
|
42
|
+
|
43
|
+
ActiveJob::GoogleCloudPubsub::Worker.new(pubsub: pubsub, **worker_args).run
|
@@ -1,20 +1,18 @@
|
|
1
|
-
require 'active_job/google_cloud_pubsub/
|
1
|
+
require 'active_job/google_cloud_pubsub/pubsub_extension'
|
2
2
|
require 'google/cloud/pubsub'
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
module ActiveJob
|
6
6
|
module GoogleCloudPubsub
|
7
7
|
class Adapter
|
8
|
-
|
8
|
+
using PubsubExtension
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@pubsub =
|
10
|
+
def initialize(pubsub: Google::Cloud::Pubsub.new)
|
11
|
+
@pubsub = pubsub
|
12
12
|
end
|
13
13
|
|
14
14
|
def enqueue(job, attributes = {})
|
15
|
-
|
16
|
-
|
17
|
-
topic.publish JSON.dump(job.serialize), attributes
|
15
|
+
@pubsub.topic_for(job.queue_name).publish JSON.dump(job.serialize), attributes
|
18
16
|
end
|
19
17
|
|
20
18
|
def enqueue_at(job, timestamp)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'google/cloud/pubsub'
|
2
|
+
|
3
|
+
module ActiveJob
|
4
|
+
module GoogleCloudPubsub
|
5
|
+
module PubsubExtension
|
6
|
+
refine Google::Cloud::Pubsub::Project do
|
7
|
+
def topic_for(queue_name)
|
8
|
+
name = "activejob-queue-#{queue_name}"
|
9
|
+
|
10
|
+
topic(name, autocreate: true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def subscription_for(queue_name)
|
14
|
+
name = "activejob-worker-#{queue_name}"
|
15
|
+
|
16
|
+
subscription(name) || topic_for(queue_name).subscribe(name)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'active_job/base'
|
2
|
-
require 'active_job/google_cloud_pubsub/
|
2
|
+
require 'active_job/google_cloud_pubsub/pubsub_extension'
|
3
3
|
require 'active_support/core_ext/numeric/time'
|
4
4
|
require 'concurrent'
|
5
5
|
require 'google/cloud/pubsub'
|
@@ -9,29 +9,20 @@ require 'logger'
|
|
9
9
|
module ActiveJob
|
10
10
|
module GoogleCloudPubsub
|
11
11
|
class Worker
|
12
|
-
include Naming
|
13
|
-
|
14
12
|
MAX_DEADLINE = 10.minutes
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
def initialize(queue: 'default', min_threads: 0, max_threads: Concurrent.processor_count, **pubsub_args)
|
19
|
-
@queue_name, @min_threads, @max_threads = queue, min_threads, max_threads
|
20
|
-
|
21
|
-
@pubsub = Google::Cloud::Pubsub.new(**pubsub_args)
|
22
|
-
end
|
14
|
+
using PubsubExtension
|
23
15
|
|
24
|
-
|
25
|
-
topic = @pubsub.topic(topic_name(@queue_name), autocreate: true)
|
16
|
+
cattr_accessor(:logger) { Logger.new($stdout) }
|
26
17
|
|
27
|
-
|
18
|
+
def initialize(queue: 'default', min_threads: 0, max_threads: Concurrent.processor_count, pubsub: Google::Cloud::Pubsub.new)
|
19
|
+
@queue_name, @min_threads, @max_threads, @pubsub = queue, min_threads, max_threads, pubsub
|
28
20
|
end
|
29
|
-
alias ensure_subscription subscription
|
30
21
|
|
31
22
|
def run
|
32
23
|
pool = Concurrent::ThreadPoolExecutor.new(min_threads: @min_threads, max_threads: @max_threads, max_queue: -1)
|
33
24
|
|
34
|
-
|
25
|
+
@pubsub.subscription_for(@queue_name).listen do |message|
|
35
26
|
begin
|
36
27
|
Concurrent::Promise.execute(args: message, executor: pool) {|msg|
|
37
28
|
process msg
|
@@ -44,6 +35,12 @@ module ActiveJob
|
|
44
35
|
end
|
45
36
|
end
|
46
37
|
|
38
|
+
def ensure_subscription
|
39
|
+
@pubsub.subscription_for @queue_name
|
40
|
+
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
|
47
44
|
private
|
48
45
|
|
49
46
|
def process(message)
|
@@ -53,7 +50,7 @@ module ActiveJob
|
|
53
50
|
if ts >= Time.now
|
54
51
|
_process message
|
55
52
|
else
|
56
|
-
message.delay! [ts - Time.now, MAX_DEADLINE.to_i].min
|
53
|
+
message.delay! [(ts - Time.now).ceil, MAX_DEADLINE.to_i].min
|
57
54
|
end
|
58
55
|
else
|
59
56
|
_process message
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activejob-google_cloud_pubsub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keita Urashima
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activejob
|
@@ -128,7 +128,7 @@ files:
|
|
128
128
|
- bin/setup
|
129
129
|
- exe/activejob-google_cloud_pubsub-worker
|
130
130
|
- lib/active_job/google_cloud_pubsub/adapter.rb
|
131
|
-
- lib/active_job/google_cloud_pubsub/
|
131
|
+
- lib/active_job/google_cloud_pubsub/pubsub_extension.rb
|
132
132
|
- lib/active_job/google_cloud_pubsub/version.rb
|
133
133
|
- lib/active_job/google_cloud_pubsub/worker.rb
|
134
134
|
- lib/activejob-google_cloud_pubsub.rb
|