torquebox-messaging 3.2.0-java → 4.0.0.alpha1-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/torquebox-messaging.rb +19 -20
- data/lib/torquebox/messaging.rb +80 -20
- data/lib/torquebox/messaging/context.rb +174 -0
- data/lib/torquebox/messaging/destination.rb +164 -215
- data/lib/torquebox/messaging/helpers.rb +34 -0
- data/lib/torquebox/messaging/hornetq.rb +70 -0
- data/lib/torquebox/messaging/hornetq/address_settings.rb +228 -0
- data/lib/torquebox/messaging/queue.rb +139 -301
- data/lib/torquebox/messaging/topic.rb +84 -46
- data/lib/wunderboss-jars/hornetq-commons-2.4.5.Final.jar +0 -0
- data/lib/wunderboss-jars/hornetq-core-client-2.4.5.Final.jar +0 -0
- data/lib/wunderboss-jars/hornetq-jms-client-2.4.5.Final.jar +0 -0
- data/lib/wunderboss-jars/hornetq-jms-server-2.4.5.Final.jar +0 -0
- data/lib/wunderboss-jars/hornetq-journal-2.4.5.Final.jar +0 -0
- data/lib/wunderboss-jars/hornetq-native-2.4.5.Final.jar +0 -0
- data/lib/wunderboss-jars/hornetq-server-2.4.5.Final.jar +0 -0
- data/lib/wunderboss-jars/javax.inject-1.jar +0 -0
- data/lib/wunderboss-jars/jboss-common-core-2.2.10.GA.jar +0 -0
- data/lib/wunderboss-jars/jboss-connector-api_1.5_spec-1.0.0.Final.jar +0 -0
- data/lib/wunderboss-jars/jboss-jms-api_2.0_spec-1.0.0.Final.jar +0 -0
- data/lib/wunderboss-jars/jboss-transaction-api_1.1_spec-1.0.0.Final.jar +0 -0
- data/lib/wunderboss-jars/jboss-transaction-spi-7.0.0.Final.jar +0 -0
- data/lib/wunderboss-jars/jnpserver-5.0.3.GA.jar +0 -0
- data/lib/wunderboss-jars/netty-all-4.0.13.Final.jar +0 -0
- data/lib/wunderboss-jars/wunderboss-messaging-1.x.incremental.174.jar +0 -0
- metadata +88 -98
- data/lib/gem_hook.rb +0 -51
- data/lib/hornetq-commons-2.3.1.Final.jar +0 -0
- data/lib/hornetq-core-client-2.3.1.Final.jar +0 -0
- data/lib/hornetq-jms-client-2.3.1.Final.jar +0 -0
- data/lib/hornetq-journal-2.3.1.Final.jar +0 -0
- data/lib/jboss-jms-api_1.1_spec-1.0.1.Final.jar +0 -0
- data/lib/jboss-logging-3.1.2.GA.jar +0 -0
- data/lib/jboss-logmanager-1.4.0.Final.jar +0 -0
- data/lib/jboss-transaction-api_1.1_spec-1.0.1.Final.jar +0 -0
- data/lib/netty-3.6.2.Final.jar +0 -0
- data/lib/org.torquebox.messaging-client.rb +0 -20
- data/lib/torquebox-messaging.jar +0 -0
- data/lib/torquebox/messaging/backgroundable.rb +0 -250
- data/lib/torquebox/messaging/backgroundable_processor.rb +0 -52
- data/lib/torquebox/messaging/connection.rb +0 -74
- data/lib/torquebox/messaging/connection_factory.rb +0 -115
- data/lib/torquebox/messaging/const_missing.rb +0 -28
- data/lib/torquebox/messaging/core.rb +0 -27
- data/lib/torquebox/messaging/datamapper_marshaling.rb +0 -43
- data/lib/torquebox/messaging/echo_processor.rb +0 -35
- data/lib/torquebox/messaging/edn_message.rb +0 -26
- data/lib/torquebox/messaging/ext/javax_jms_queue_browser.rb +0 -25
- data/lib/torquebox/messaging/future.rb +0 -131
- data/lib/torquebox/messaging/future_responder.rb +0 -109
- data/lib/torquebox/messaging/future_status.rb +0 -37
- data/lib/torquebox/messaging/json_message.rb +0 -26
- data/lib/torquebox/messaging/marshal_base64_message.rb +0 -26
- data/lib/torquebox/messaging/marshal_message.rb +0 -43
- data/lib/torquebox/messaging/message.rb +0 -137
- data/lib/torquebox/messaging/message_processor.rb +0 -209
- data/lib/torquebox/messaging/processor_middleware/chain.rb +0 -89
- data/lib/torquebox/messaging/processor_middleware/default_middleware.rb +0 -39
- data/lib/torquebox/messaging/processor_middleware/with_transaction.rb +0 -35
- data/lib/torquebox/messaging/session.rb +0 -173
- data/lib/torquebox/messaging/task.rb +0 -66
- data/lib/torquebox/messaging/text_message.rb +0 -36
- data/lib/torquebox/messaging/xa_connection.rb +0 -55
- data/lib/torquebox/messaging/xa_connection_factory.rb +0 -45
- data/lib/torquebox/messaging/xa_session.rb +0 -51
- data/licenses/cc0-1.0.txt +0 -121
- data/spec/backgroundable_spec.rb +0 -319
- data/spec/chain_spec.rb +0 -160
- data/spec/datamapper_marshaling_spec.rb +0 -25
- data/spec/default_middleware_spec.rb +0 -21
- data/spec/destination_spec.rb +0 -248
- data/spec/future_responder_spec.rb +0 -81
- data/spec/future_spec.rb +0 -163
- data/spec/message_processor_spec.rb +0 -211
- data/spec/message_spec.rb +0 -135
- data/spec/task_spec.rb +0 -111
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e0d4bba6bdf81556ac4029954113a4ca1261182
|
4
|
+
data.tar.gz: b60488fcd243cb03eb35dd93206a0a81a2979200
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 379e6fdca557bb4ee68d126334324537ac1abd1793b213b85d566605adf3d6af613668d76cb006efee9d0e44557d63a21a6d27a034d181eec6484ccc25c9379a
|
7
|
+
data.tar.gz: 7f9b80963a6097523f642ac06c0190e007fb8b3d052f1b7476d8a90222e001c835bfbdd486950d2043fdef0a2d26e31c31b2e25d92f2b9f83c3f26d83770b3f7
|
data/lib/torquebox-messaging.rb
CHANGED
@@ -1,22 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
raise
|
1
|
+
# Copyright 2014 Red Hat, Inc, and individual contributors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'torquebox-core'
|
16
|
+
|
17
|
+
Dir.glob("#{File.dirname(__FILE__)}/wunderboss-jars/*.jar") do |jar|
|
18
|
+
TorqueBox::Jars.register_and_require(jar)
|
20
19
|
end
|
21
20
|
|
22
|
-
|
21
|
+
require 'torquebox/messaging'
|
data/lib/torquebox/messaging.rb
CHANGED
@@ -1,22 +1,82 @@
|
|
1
|
-
# Copyright
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
# License along with this software; if not, write to the Free
|
15
|
-
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
16
|
-
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
1
|
+
# Copyright 2014 Red Hat, Inc, and individual contributors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
17
14
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
require 'torquebox/messaging/context'
|
16
|
+
require 'torquebox/messaging/destination'
|
17
|
+
require 'torquebox/messaging/queue'
|
18
|
+
require 'torquebox/messaging/topic'
|
19
|
+
require 'torquebox/messaging/hornetq'
|
20
|
+
|
21
|
+
module TorqueBox
|
22
|
+
module Messaging
|
23
|
+
def self.default_encoding
|
24
|
+
@default_encoding ||= :marshal
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.default_encoding=(enc)
|
28
|
+
@default_encoding = enc
|
29
|
+
end
|
30
|
+
|
31
|
+
# Creates a new queue reference.
|
32
|
+
#
|
33
|
+
# This may be a reference to a remote or local (in-vm) queue.
|
34
|
+
# Obtaining a reference to an in-vm queue will cause the queue
|
35
|
+
# to be created within the broker if it does not already exist.
|
36
|
+
# For remote queues, the queue must already exist in the remote
|
37
|
+
# broker.
|
38
|
+
#
|
39
|
+
# If a context is provided, it must be remote, and will be
|
40
|
+
# remembered and used by any method that takes a `:context`
|
41
|
+
# option.
|
42
|
+
#
|
43
|
+
# @param name [String] The name of the queue.
|
44
|
+
# @param options [Hash] Options for queue creation.
|
45
|
+
# @option options :context [Context] A context to a
|
46
|
+
# *remote* broker to use; caller expected to close.
|
47
|
+
# @option options :durable [true, false] (true) Whether messages
|
48
|
+
# persist across restarts.
|
49
|
+
# @option options :selector [String] A JMS (SQL 92) expression
|
50
|
+
# to filter published messages.
|
51
|
+
# @option options :default_options [Hash] A set of default
|
52
|
+
# options to apply to any operations on this queue.
|
53
|
+
# @return [Queue] The queue reference.
|
54
|
+
def self.queue(name, options = {})
|
55
|
+
Queue.new(name, options)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Creates a new topic reference.
|
59
|
+
#
|
60
|
+
# This may be a reference to a remote or local (in-vm) topic.
|
61
|
+
# Obtaining a reference to an in-vm topic will cause the topic
|
62
|
+
# to be created within the broker if it does not already exist.
|
63
|
+
# For remote topics, the topic must already exist in the remote
|
64
|
+
# broker.
|
65
|
+
#
|
66
|
+
# If a context is provided, it must be remote, and will be
|
67
|
+
# remembered and used by any method that takes a `:context`
|
68
|
+
# option.
|
69
|
+
#
|
70
|
+
# @param name [String] The name of the topic.
|
71
|
+
# @param options [Hash] Options for topic creation.
|
72
|
+
# @option options :context [Context] A context to a
|
73
|
+
# *remote* broker to use; caller expected to close.
|
74
|
+
# @option options :default_options [Hash] A set of default
|
75
|
+
# options to apply to any operations on this topic.
|
76
|
+
# @return [Topic] The topic reference.
|
77
|
+
def self.topic(name, options = {})
|
78
|
+
Topic.new(name, options)
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
22
82
|
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
# Copyright 2014 Red Hat, Inc, and individual contributors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'torquebox/messaging/helpers'
|
16
|
+
|
17
|
+
module TorqueBox
|
18
|
+
module Messaging
|
19
|
+
# Represents a context to the message broker.
|
20
|
+
#
|
21
|
+
# You should only need to create a Context directly if you are
|
22
|
+
# connecting to a remote broker, you need transactional semantics,
|
23
|
+
# or you need better perfomance when doing lots of
|
24
|
+
# {Destination#publish} or {Destination#receive} calls in rapid
|
25
|
+
# succession, since each call will
|
26
|
+
# create and close a context if one is not provided.
|
27
|
+
class Context
|
28
|
+
include TorqueBox::OptionUtils
|
29
|
+
include TorqueBox::Messaging::Helpers
|
30
|
+
extend TorqueBox::OptionUtils
|
31
|
+
|
32
|
+
attr_reader :internal_context
|
33
|
+
|
34
|
+
# Valid options for Context creation.
|
35
|
+
CONTEXT_OPTIONS = optset(WBMessaging::CreateContextOption)
|
36
|
+
|
37
|
+
# Creates a new context.
|
38
|
+
#
|
39
|
+
# You are responsible for closing any contexts you create.
|
40
|
+
#
|
41
|
+
# If given a block, the Context instance will be passed to
|
42
|
+
# the block and the Context will be closed once the block
|
43
|
+
# returns.
|
44
|
+
#
|
45
|
+
# @param options [Hash]
|
46
|
+
# @option options :mode [Symbol] (:auto_ack) One of: :auto_ack,
|
47
|
+
# :client_ack, :transacted
|
48
|
+
# @option options :client_id [String] Identifies the client id
|
49
|
+
# for use with a durable topic subscriber.
|
50
|
+
# @option options :host [String] The host of a remote broker.
|
51
|
+
# @option options :port [Number] (nil, 5445 if :host provided)
|
52
|
+
# The port of a remote broker.
|
53
|
+
# @option options :username [String] The username for the remote
|
54
|
+
# broker.
|
55
|
+
# @option options :password [String] The password for the remote
|
56
|
+
# broker.
|
57
|
+
# @option options :remote_type [Symbol] (:hornetq_standalone)
|
58
|
+
# When connecting to a HornetQ instance running inside
|
59
|
+
# WildFly, this needs to be set to :hornetq_wildfly.
|
60
|
+
# @option options :reconnect_attempts [Number] (0) Total number
|
61
|
+
# of reconnect attempts to make before giving up (-1 for unlimited).
|
62
|
+
# @option options :reconnect_retry_interval [Number] (2000) The
|
63
|
+
# period in milliseconds between subsequent recontext attempts.
|
64
|
+
# @option options :reconnect_max_retry_interval [Number] (2000)
|
65
|
+
# The max retry interval that will be used.
|
66
|
+
# @option options :reconnect_retry_interval_multiplier [Number]
|
67
|
+
# (1.0) A multiplier to apply to the time since the last retry
|
68
|
+
# to compute the time to the next retry.
|
69
|
+
# @return [Context]
|
70
|
+
def initialize(options = {}, &block)
|
71
|
+
validate_options(options, CONTEXT_OPTIONS)
|
72
|
+
options[:mode] = coerce_mode(options[:mode])
|
73
|
+
create_options = extract_options(options, WBMessaging::CreateContextOption)
|
74
|
+
@internal_context = default_broker.create_context(create_options)
|
75
|
+
if block
|
76
|
+
begin
|
77
|
+
block.call(self)
|
78
|
+
ensure
|
79
|
+
close
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Creates a Queue from this context.
|
85
|
+
#
|
86
|
+
# The Queue instance will use this context for
|
87
|
+
# any of its methods that take a `:context` option.
|
88
|
+
#
|
89
|
+
# @param (see Queue#initialize)
|
90
|
+
# @return (see Queue#initialize)
|
91
|
+
def queue(name, options = {})
|
92
|
+
TorqueBox::Messaging.queue(name, options.merge(:context => self))
|
93
|
+
end
|
94
|
+
|
95
|
+
# Creates a Topic from this context.
|
96
|
+
#
|
97
|
+
# The Topic instance will use this context for
|
98
|
+
# any of its methods that take a `:context` option.
|
99
|
+
#
|
100
|
+
# @param (see Topic#initialize)
|
101
|
+
# @return (see Topic#initialize)
|
102
|
+
def topic(name, options = {})
|
103
|
+
TorqueBox::Messaging.topic(name, options.merge(:context => self))
|
104
|
+
end
|
105
|
+
|
106
|
+
# Closes this context.
|
107
|
+
#
|
108
|
+
# Once closed, any operations on this context will raise
|
109
|
+
# errors.
|
110
|
+
# @return [void]
|
111
|
+
def close
|
112
|
+
@internal_context.close
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
# Rolls back the context.
|
117
|
+
#
|
118
|
+
# This only has affect for :transacted contexts.
|
119
|
+
#
|
120
|
+
# @return [void]
|
121
|
+
def rollback
|
122
|
+
@internal_context.rollback
|
123
|
+
end
|
124
|
+
|
125
|
+
# Commits the context.
|
126
|
+
#
|
127
|
+
# This only has affect for :transacted contexts.
|
128
|
+
#
|
129
|
+
# @return [void]
|
130
|
+
def commit
|
131
|
+
@internal_context.commit
|
132
|
+
end
|
133
|
+
|
134
|
+
# Acknowledge any un-acknowledged messages in this context.
|
135
|
+
#
|
136
|
+
# This only has affect for :client_ack contexts.
|
137
|
+
#
|
138
|
+
# @return [void]
|
139
|
+
def acknowledge
|
140
|
+
@internal_context.acknowledge
|
141
|
+
end
|
142
|
+
|
143
|
+
# @return [Symbol] The mode of this context.
|
144
|
+
def mode
|
145
|
+
case @internal_context.mode
|
146
|
+
when WBContext::Mode::AUTO_ACK
|
147
|
+
:auto_ack
|
148
|
+
when WBContext::Mode::CLIENT_ACK
|
149
|
+
:client_ack
|
150
|
+
when WBContext::Mode::TRANSACTED
|
151
|
+
:transacted
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
protected
|
156
|
+
|
157
|
+
def coerce_mode(mode)
|
158
|
+
case mode
|
159
|
+
when nil
|
160
|
+
nil
|
161
|
+
when :auto_ack
|
162
|
+
WBContext::Mode::AUTO_ACK
|
163
|
+
when :client_ack
|
164
|
+
WBContext::Mode::CLIENT_ACK
|
165
|
+
when :transacted
|
166
|
+
WBContext::Mode::TRANSACTED
|
167
|
+
else
|
168
|
+
fail ArgumentError.new("#{mode} is not a valid context mode.")
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -1,37 +1,34 @@
|
|
1
|
-
# Copyright
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
require 'torquebox/injectors'
|
19
|
-
require 'torquebox/msc'
|
20
|
-
require 'torquebox/messaging/session'
|
21
|
-
require 'torquebox/messaging/connection_factory'
|
22
|
-
require 'torquebox/messaging/ext/javax_jms_queue_browser'
|
1
|
+
# Copyright 2014 Red Hat, Inc, and individual contributors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'torquebox/codecs'
|
16
|
+
require 'torquebox/messaging/helpers'
|
23
17
|
|
24
18
|
module TorqueBox
|
25
19
|
module Messaging
|
20
|
+
# Represents a messaging destination.
|
21
|
+
#
|
22
|
+
# You'll never instantiate a Destination directly, but use {Queue}
|
23
|
+
# or {Topic} instead.
|
26
24
|
class Destination
|
27
|
-
include
|
25
|
+
include TorqueBox::OptionUtils
|
26
|
+
include TorqueBox::Messaging::Helpers
|
27
|
+
extend TorqueBox::OptionUtils
|
28
28
|
|
29
|
-
|
30
|
-
attr_reader :name
|
31
|
-
attr_reader :java_destination
|
32
|
-
attr_accessor :enumerable_options
|
33
|
-
attr_accessor :connect_options
|
29
|
+
attr_accessor :internal_destination
|
34
30
|
|
31
|
+
# Maps priority mnemonics to priority values.
|
35
32
|
PRIORITY_MAP = {
|
36
33
|
:low => 1,
|
37
34
|
:normal => 4,
|
@@ -39,228 +36,180 @@ module TorqueBox
|
|
39
36
|
:critical => 9
|
40
37
|
}
|
41
38
|
|
42
|
-
|
43
|
-
|
44
|
-
end
|
39
|
+
# Valid options for {#publish}.
|
40
|
+
PUBLISH_OPTIONS = optset(WBDestination::PublishOption, :encoding)
|
45
41
|
|
46
|
-
|
47
|
-
|
42
|
+
# Send a message to this destination.
|
43
|
+
#
|
44
|
+
# The message can be any data that can be encoded using the
|
45
|
+
# given :encoding.
|
46
|
+
#
|
47
|
+
# If no context is provided, a new context will be created, then
|
48
|
+
# closed.
|
49
|
+
#
|
50
|
+
# @param message [Object] The message to send.
|
51
|
+
# @param options [Hash] Options for message publication.
|
52
|
+
# @option options :encoding [Symbol] (:marshal) one of: :edn, :json,
|
53
|
+
# :marshal, :marshal_base64, :text
|
54
|
+
# @option options :priority [Symbol, Number] (:normal) 0-9, or
|
55
|
+
# one of: :low, :normal, :high, :critical
|
56
|
+
# @option options :ttl [Number] (0) time to live, in millis, 0
|
57
|
+
# == forever
|
58
|
+
# @option options :persistent [true, false] (true) whether
|
59
|
+
# undelivered messages survive restarts
|
60
|
+
# @option options :properties [Hash] a hash to which selectors
|
61
|
+
# may be applied
|
62
|
+
# @option options :context [Context] a context to use;
|
63
|
+
# caller expected to close
|
64
|
+
# @return [void]
|
65
|
+
def publish(message, options = {})
|
66
|
+
validate_options(options, PUBLISH_OPTIONS)
|
67
|
+
options = apply_default_options(options)
|
68
|
+
options = normalize_publish_options(options)
|
69
|
+
options = coerce_context(options)
|
70
|
+
encoding = options[:encoding] || Messaging.default_encoding
|
71
|
+
@internal_destination.publish(message,
|
72
|
+
Codecs[encoding],
|
73
|
+
extract_options(options, WBDestination::PublishOption))
|
48
74
|
end
|
49
75
|
|
50
|
-
|
51
|
-
|
52
|
-
if connection_factory_or_options.nil? || connection_factory_or_options.is_a?( Hash )
|
53
|
-
options = connection_factory_or_options
|
54
|
-
connection_factory = TorqueBox.fetch( 'connection-factory' )
|
55
|
-
unless options.nil?
|
56
|
-
# Don't use our internal connection factory if the user
|
57
|
-
# has specified a host or port to connect to
|
58
|
-
connection_factory = nil if options[:host] or options[:port]
|
59
|
-
end
|
60
|
-
@connection_factory = ConnectionFactory.new( connection_factory )
|
61
|
-
@connect_options = options || {}
|
62
|
-
else
|
63
|
-
@connection_factory = ConnectionFactory.new( connection_factory_or_options )
|
64
|
-
@connect_options = {}
|
65
|
-
end
|
76
|
+
# Valid options for {#receive}.
|
77
|
+
RECEIVE_OPTIONS = optset(WBDestination::ReceiveOption, :decode, :timeout_val)
|
66
78
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
79
|
+
# Receive a message from this destination.
|
80
|
+
#
|
81
|
+
# Can optionally be given a block that will be called with
|
82
|
+
# the message.
|
83
|
+
#
|
84
|
+
# If a :selector is provided, then only messages having
|
85
|
+
# properties matching that expression may be received.
|
86
|
+
#
|
87
|
+
# If no context is provided, a new context will be created, then
|
88
|
+
# closed.
|
89
|
+
#
|
90
|
+
# @param options [Hash] Options for message receipt.
|
91
|
+
# @option options :timeout [Number] (10000) Time in millis,
|
92
|
+
# after which the :timeout_val is returned. 0
|
93
|
+
# means wait forever, -1 means don't wait at all
|
94
|
+
# @option options :timeout_val [Object] The value to
|
95
|
+
# return when a timeout occurs. Also returned when
|
96
|
+
# a :timeout of -1 is specified, and no message is available
|
97
|
+
# @option options :selector [String] A JMS (SQL 92) expression
|
98
|
+
# matching message properties
|
99
|
+
# @option options :decode [true, false] (true) If true, the
|
100
|
+
# decoded message body is returned. Otherwise, the
|
101
|
+
# base message object is returned.
|
102
|
+
# @option options :context [Context] a context to use;
|
103
|
+
# caller expected to close
|
104
|
+
# @return The message, or the return value of the block if a
|
105
|
+
# block is given.
|
106
|
+
def receive(options = {}, &block)
|
107
|
+
validate_options(options, RECEIVE_OPTIONS)
|
108
|
+
options = apply_default_options(options)
|
109
|
+
options = coerce_context(options)
|
110
|
+
result = @internal_destination.receive(Codecs.java_codecs,
|
111
|
+
extract_options(options, WBDestination::ReceiveOption))
|
112
|
+
msg = if result
|
113
|
+
options.fetch(:decode, true) ? result.body : result
|
114
|
+
else
|
115
|
+
options[:timeout_val]
|
116
|
+
end
|
117
|
+
block ? block.call(msg) : msg
|
82
118
|
end
|
83
119
|
|
84
|
-
#
|
120
|
+
# Valid options for {#listen}
|
121
|
+
LISTEN_OPTIONS = optset(WBDestination::ListenOption, :encoding, :decode)
|
122
|
+
|
123
|
+
# Registers a block to receive each message sent to this destination.
|
85
124
|
#
|
86
|
-
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
|
90
|
-
|
91
|
-
|
125
|
+
# If a :selector is provided, then only messages having
|
126
|
+
# properties matching that expression will be received.
|
127
|
+
#
|
128
|
+
# If given a context, the context must be remote, and the mode
|
129
|
+
# of that context is ignored, since it is used solely to
|
130
|
+
# generate sub-contexts for each listener thread. Closing the
|
131
|
+
# given context will also close the listener.
|
132
|
+
#
|
133
|
+
# If no context is provided, a new context will be created, then
|
134
|
+
# closed.
|
135
|
+
#
|
136
|
+
# @param options [Hash] Options for the listener.
|
137
|
+
# @option options :concurrency [Number] (1) The number of
|
138
|
+
# threads handling messages.
|
139
|
+
# @option options :selector [String] A JMS (SQL 92) expression
|
140
|
+
# matching message properties
|
141
|
+
# @option options :decode [true, false] If true, the decoded
|
142
|
+
# message body is passed to the block. Otherwise, the
|
143
|
+
# base message object is passed.
|
144
|
+
# @option options :context [Context] a *remote* context to
|
145
|
+
# use; caller expected to close.
|
146
|
+
# @return A listener object that can be stopped by
|
147
|
+
# calling .close on it.
|
148
|
+
def listen(options = {}, &block)
|
149
|
+
validate_options(options, LISTEN_OPTIONS)
|
150
|
+
options = apply_default_options(options)
|
151
|
+
options = coerce_context(options)
|
152
|
+
handler = MessageHandler.new do |message|
|
153
|
+
block.call(options.fetch(:decode, true) ? message.body : message)
|
92
154
|
end
|
155
|
+
@internal_destination.listen(handler,
|
156
|
+
Codecs.java_codecs,
|
157
|
+
extract_options(options, WBDestination::ListenOption))
|
93
158
|
end
|
94
159
|
|
95
|
-
# Stops
|
160
|
+
# Stops this destination.
|
96
161
|
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
# @see TorqueBox::Messaging::Destination.stop
|
100
|
-
def stop_sync
|
101
|
-
TorqueBox::Messaging::Destination.wait_for_latch(stop)
|
102
|
-
end
|
103
|
-
|
104
|
-
# Publishes a message to the destination
|
162
|
+
# Note that stopping a destination may remove it from the broker if
|
163
|
+
# called outside of the container.
|
105
164
|
#
|
106
|
-
# @param message The message to publish
|
107
|
-
# @param options Optional parameters (a Hash)
|
108
165
|
# @return [void]
|
109
|
-
def
|
110
|
-
|
111
|
-
with_session(options) do |session|
|
112
|
-
session.publish self, message, normalize_options(options)
|
113
|
-
end
|
114
|
-
end
|
166
|
+
def stop
|
167
|
+
@internal_destination.stop
|
115
168
|
end
|
116
169
|
|
117
|
-
|
118
|
-
wait_for_destination(options[:startup_timeout]) do
|
119
|
-
func = lambda do
|
120
|
-
with_session(options) do |session|
|
121
|
-
session.receive self, options, &block
|
122
|
-
end
|
123
|
-
end
|
124
|
-
if block
|
125
|
-
TorqueBox.transaction &func
|
126
|
-
else
|
127
|
-
func.call
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
170
|
+
protected
|
131
171
|
|
132
|
-
def
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
browser = session.create_browser( destination, enumerable_options[:selector] )
|
137
|
-
begin
|
138
|
-
browser.each(&block)
|
139
|
-
ensure
|
140
|
-
browser.close
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
172
|
+
def initialize(internal_destination, options)
|
173
|
+
@internal_destination = internal_destination
|
174
|
+
@default_options = options[:default_options] || {}
|
175
|
+
@default_options[:context] ||= options[:context]
|
144
176
|
end
|
145
177
|
|
146
|
-
def
|
147
|
-
|
148
|
-
|
149
|
-
# https://issues.jboss.org/browse/TORQUE-1033
|
150
|
-
# If there is no encoding for the message, set the default one
|
151
|
-
# for the destination. If the encoding for destination isn't set
|
152
|
-
# it won't hurt
|
153
|
-
opts[:encoding] = @connect_options[:encoding] if opts[:encoding].nil?
|
154
|
-
|
155
|
-
connection_factory.with_new_connection(connect_options, transactional) do |connection|
|
156
|
-
connection.with_session do |session|
|
157
|
-
yield session
|
158
|
-
end
|
159
|
-
end
|
178
|
+
def apply_default_options(options)
|
179
|
+
@default_options.merge(options || {})
|
160
180
|
end
|
161
181
|
|
162
|
-
def
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
block.call
|
167
|
-
rescue javax.naming.NameNotFoundException, javax.jms.JMSException
|
168
|
-
elapsed = (Time.now - start) * 1000
|
169
|
-
if elapsed > timeout
|
170
|
-
raise
|
171
|
-
else
|
172
|
-
sleep(0.1)
|
173
|
-
retry
|
174
|
-
end
|
175
|
-
end
|
182
|
+
def coerce_context(options)
|
183
|
+
options = options.dup
|
184
|
+
options[:context] = options[:context].internal_context if options[:context]
|
185
|
+
options
|
176
186
|
end
|
177
187
|
|
178
|
-
def
|
179
|
-
|
180
|
-
|
181
|
-
options.delete(:persistent) ? javax.jms::DeliveryMode.PERSISTENT : javax.jms::DeliveryMode.NON_PERSISTENT
|
182
|
-
end
|
183
|
-
|
184
|
-
if options.has_key?(:priority)
|
188
|
+
def normalize_publish_options(options)
|
189
|
+
options = options.dup
|
190
|
+
if options.key?(:priority)
|
185
191
|
if PRIORITY_MAP[options[:priority]]
|
186
192
|
options[:priority] = PRIORITY_MAP[options[:priority]]
|
187
193
|
elsif (0..9) === options[:priority].to_i
|
188
194
|
options[:priority] = options[:priority].to_i
|
189
195
|
else
|
190
|
-
|
196
|
+
priorities = PRIORITY_MAP.keys.map { |k| ":#{k }" }.join(',')
|
197
|
+
fail ArgumentError.new(":priority must in the range 0..9, or one of #{priorities}")
|
191
198
|
end
|
192
199
|
end
|
193
|
-
|
194
200
|
options
|
195
201
|
end
|
196
202
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
end
|
201
|
-
|
202
|
-
def to_s
|
203
|
-
name
|
204
|
-
end
|
205
|
-
|
206
|
-
class << self
|
207
|
-
|
208
|
-
# List all destinations of this application.
|
209
|
-
#
|
210
|
-
# @return Array of {TorqueBox::Messaging::Queue} or {TorqueBox::Messaging::Topic}
|
211
|
-
# depending on the destination type.
|
212
|
-
def list
|
213
|
-
# Get the JMS Manager
|
214
|
-
TorqueBox::ServiceRegistry.lookup("jboss.messaging.default.jms.manager") do |manager|
|
215
|
-
|
216
|
-
# JMSServerControl will let us grab the deployed queue/topic list
|
217
|
-
server_control = Java::org.hornetq.jms.management.impl.JMSServerControlImpl.new(manager)
|
218
|
-
|
219
|
-
# Retrieve the destination list appropriate to the destination type
|
220
|
-
if self == TorqueBox::Messaging::Topic
|
221
|
-
names = server_control.topic_names
|
222
|
-
elsif self == TorqueBox::Messaging::Queue
|
223
|
-
names = server_control.queue_names
|
224
|
-
else
|
225
|
-
names = []
|
226
|
-
end
|
203
|
+
# @api private
|
204
|
+
class MessageHandler
|
205
|
+
include Java::OrgProjectoddWunderbossMessaging::MessageHandler
|
227
206
|
|
228
|
-
|
229
|
-
|
230
|
-
end
|
231
|
-
|
232
|
-
# Lookup a destination of this application by name. A destination could be
|
233
|
-
# a queue or topic.
|
234
|
-
#
|
235
|
-
# @param [String] name of the destination
|
236
|
-
#
|
237
|
-
# @return [TorqueBox::Messaging::Queue] or [TorqueBox::Messaging::Topic]
|
238
|
-
# The destination instance.
|
239
|
-
def lookup(name)
|
240
|
-
list.find { |destination| destination.name == name }
|
241
|
-
end
|
242
|
-
|
243
|
-
# @api private
|
244
|
-
def with_destinationizer
|
245
|
-
service_name = TorqueBox::MSC.deployment_unit.service_name.append('torquebox').append('messaging').append('destinationizer')
|
246
|
-
|
247
|
-
TorqueBox::ServiceRegistry.lookup(service_name) do |destinationizer|
|
248
|
-
yield destinationizer
|
249
|
-
end
|
207
|
+
def initialize(&block)
|
208
|
+
@block = block
|
250
209
|
end
|
251
210
|
|
252
|
-
|
253
|
-
|
254
|
-
if latch
|
255
|
-
begin
|
256
|
-
# Wait for the services to come up for up to 30 seconds
|
257
|
-
latch.await(45, java.util.concurrent.TimeUnit::SECONDS)
|
258
|
-
rescue
|
259
|
-
return false
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
true
|
211
|
+
def on_message(message, context)
|
212
|
+
@block.call(message, context)
|
264
213
|
end
|
265
214
|
end
|
266
215
|
|