logstash-input-jms 3.0.6-java → 3.1.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/docs/index.asciidoc +453 -48
- data/lib/logstash/inputs/jms.rb +184 -115
- data/logstash-input-jms.gemspec +1 -1
- data/spec/inputs/fixtures/activemq_plaintext.xml +132 -0
- data/spec/inputs/fixtures/activemq_ssl.xml +137 -0
- data/spec/inputs/fixtures/jms.yml +14 -0
- data/spec/inputs/fixtures/jndijms.yml +22 -0
- data/spec/inputs/fixtures/keystore.jks +0 -0
- data/spec/inputs/integration/jms_spec.rb +284 -0
- data/spec/inputs/spec_helper.rb +37 -0
- data/spec/inputs/unit/jms_spec.rb +256 -0
- metadata +18 -6
- data/spec/inputs/jms.yml +0 -18
- data/spec/inputs/jms_spec.rb +0 -30
data/lib/logstash/inputs/jms.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "logstash/inputs/base"
|
3
3
|
require "logstash/inputs/threadable"
|
4
|
+
require 'java'
|
4
5
|
require "logstash/namespace"
|
5
6
|
|
6
7
|
# Read events from a Jms Broker. Supports both Jms Queues and Topics.
|
@@ -34,6 +35,13 @@ class LogStash::Inputs::Jms < LogStash::Inputs::Threadable
|
|
34
35
|
config :include_header, :validate => :boolean, :default => true
|
35
36
|
# Include JMS Message Properties Field values in the event
|
36
37
|
config :include_properties, :validate => :boolean, :default => true
|
38
|
+
|
39
|
+
# List of headers to skip from the event if headers are included
|
40
|
+
config :skip_headers, :validate => :array, :default => []
|
41
|
+
|
42
|
+
# List of properties to skip from the event if properties are included
|
43
|
+
config :skip_properties, :validate => :array, :default => []
|
44
|
+
|
37
45
|
# Include JMS Message Body in the event
|
38
46
|
# Supports TextMessage, MapMessage and ByteMessage
|
39
47
|
# If the JMS Message is a TextMessage or ByteMessage, then the value will be in the "message" field of the event
|
@@ -50,7 +58,7 @@ class LogStash::Inputs::Jms < LogStash::Inputs::Threadable
|
|
50
58
|
config :use_jms_timestamp, :validate => :boolean, :default => false
|
51
59
|
|
52
60
|
# Choose an implementation of the run block. Value can be either consumer, async or thread
|
53
|
-
config :runner, :
|
61
|
+
config :runner, :deprecated => true
|
54
62
|
|
55
63
|
# Set the selector to use to get messages off the queue or topic
|
56
64
|
config :selector, :validate => :string
|
@@ -59,13 +67,18 @@ class LogStash::Inputs::Jms < LogStash::Inputs::Threadable
|
|
59
67
|
config :timeout, :validate => :number, :default => 60
|
60
68
|
|
61
69
|
# Polling interval in seconds.
|
62
|
-
# This is the time sleeping between asks to a consumed Queue.
|
63
|
-
# This parameter has non influence in the case of a subcribed Topic.
|
64
70
|
config :interval, :validate => :number, :default => 10
|
65
71
|
|
66
72
|
# If pub-sub (topic) style should be used.
|
67
73
|
config :pub_sub, :validate => :boolean, :default => false
|
68
74
|
|
75
|
+
# Durable subscriber settings.
|
76
|
+
# By default the `durable_subscriber_name` will be set to the topic, and `durable_subscriber_client_id` will be set
|
77
|
+
# to 'Logstash'
|
78
|
+
config :durable_subscriber, :validate => :boolean, :default => false
|
79
|
+
config :durable_subscriber_client_id, :validate => :string, :required => false
|
80
|
+
config :durable_subscriber_name, :validate => :string, :required => false
|
81
|
+
|
69
82
|
# Name of the destination queue or topic to use.
|
70
83
|
config :destination, :validate => :string, :required => true
|
71
84
|
|
@@ -88,7 +101,7 @@ class LogStash::Inputs::Jms < LogStash::Inputs::Threadable
|
|
88
101
|
# Username to connect to JMS provider with
|
89
102
|
config :username, :validate => :string
|
90
103
|
# Password to use when connecting to the JMS provider
|
91
|
-
config :password, :validate => :
|
104
|
+
config :password, :validate => :password
|
92
105
|
# Url to use when connecting to the JMS provider
|
93
106
|
config :broker_url, :validate => :string
|
94
107
|
|
@@ -98,6 +111,18 @@ class LogStash::Inputs::Jms < LogStash::Inputs::Threadable
|
|
98
111
|
# contains details on how to connect to JNDI server
|
99
112
|
config :jndi_context, :validate => :hash
|
100
113
|
|
114
|
+
# System properties
|
115
|
+
config :system_properties, :validate => :hash
|
116
|
+
|
117
|
+
# Factory settings
|
118
|
+
config :factory_settings, :validate => :hash
|
119
|
+
|
120
|
+
config :keystore, :validate => :path
|
121
|
+
config :keystore_password, :validate => :password
|
122
|
+
config :truststore, :validate => :path
|
123
|
+
config :truststore_password, :validate => :password
|
124
|
+
|
125
|
+
|
101
126
|
# :yaml_file, :factory and :jndi_name are mutually exclusive, both cannot be supplied at the
|
102
127
|
# same time. The priority order is :yaml_file, then :jndi_name, then :factory
|
103
128
|
#
|
@@ -109,34 +134,125 @@ class LogStash::Inputs::Jms < LogStash::Inputs::Threadable
|
|
109
134
|
public
|
110
135
|
def register
|
111
136
|
require "jms"
|
112
|
-
@connection = nil
|
113
137
|
|
114
|
-
|
115
|
-
|
138
|
+
check_config
|
139
|
+
load_ssl_properties
|
140
|
+
load_system_properties if @system_properties
|
141
|
+
@jms_config = jms_config
|
142
|
+
|
143
|
+
@logger.debug("JMS Config being used ", :context => obfuscate_jms_config(@jms_config))
|
144
|
+
end # def register
|
145
|
+
|
146
|
+
def obfuscate_jms_config(config)
|
147
|
+
config.each_with_object({}) { |(k, v), h| h[k] = obfuscatable?(k) ? 'xxxxx' : v }
|
148
|
+
end
|
149
|
+
|
150
|
+
def obfuscatable?(setting)
|
151
|
+
[:password, :keystore_password, :truststore_password].include?(setting)
|
152
|
+
end
|
153
|
+
|
154
|
+
def jms_config
|
155
|
+
return jms_config_from_yaml(@yaml_file, @yaml_section) if @yaml_file
|
156
|
+
return jms_config_from_jndi if @jndi_name
|
157
|
+
jms_config_from_configuration
|
158
|
+
end
|
116
159
|
|
117
|
-
elsif @jndi_name
|
118
|
-
@jms_config = {
|
119
|
-
:require_jars => @require_jars,
|
120
|
-
:jndi_name => @jndi_name,
|
121
|
-
:jndi_context => @jndi_context}
|
122
160
|
|
123
|
-
|
124
|
-
|
161
|
+
def jms_config_from_configuration
|
162
|
+
config = {
|
125
163
|
:require_jars => @require_jars,
|
126
164
|
:factory => @factory,
|
127
165
|
:username => @username,
|
128
|
-
:password => @password,
|
129
166
|
:broker_url => @broker_url,
|
130
167
|
:url => @broker_url # "broker_url" is named "url" with Oracle AQ
|
131
|
-
|
168
|
+
}
|
169
|
+
|
170
|
+
config[:password] = @password.value unless @password.nil?
|
171
|
+
correct_factory_hash(config, @factory_settings) unless @factory_settings.nil?
|
172
|
+
config
|
173
|
+
end
|
174
|
+
|
175
|
+
def correct_factory_hash(original, value)
|
176
|
+
if hash.is_a?(String)
|
177
|
+
return true if value.downcase == "true"
|
178
|
+
return false if value.downcase == "false"
|
132
179
|
end
|
133
180
|
|
134
|
-
|
181
|
+
if value.is_a?(Hash)
|
182
|
+
value.each { |key, value| original[key.to_sym] = correct_factory_hash({}, value) }
|
183
|
+
return original
|
184
|
+
end
|
185
|
+
value
|
186
|
+
end
|
135
187
|
|
136
|
-
|
188
|
+
def jms_config_from_jndi
|
189
|
+
{
|
190
|
+
:require_jars => @require_jars,
|
191
|
+
:jndi_name => @jndi_name,
|
192
|
+
:jndi_context => @jndi_context
|
193
|
+
}
|
194
|
+
end
|
195
|
+
|
196
|
+
def jms_config_from_yaml(file, section)
|
197
|
+
YAML.load_file(file)[section]
|
198
|
+
end
|
199
|
+
|
200
|
+
def load_ssl_properties
|
201
|
+
java.lang.System.setProperty("javax.net.ssl.keyStore", @keystore) if @keystore
|
202
|
+
java.lang.System.setProperty("javax.net.ssl.keyStorePassword", @keystore_password.value) if @keystore_password
|
203
|
+
java.lang.System.setProperty("javax.net.ssl.trustStore", @truststore) if @truststore
|
204
|
+
java.lang.System.setProperty("javax.net.ssl.trustStorePassword", @truststore_password.value) if @truststore_password
|
205
|
+
end
|
206
|
+
|
207
|
+
def load_system_properties
|
208
|
+
@system_properties.each { |k,v| java.lang.System.set_property(k,v.to_s) }
|
209
|
+
end
|
210
|
+
|
211
|
+
def check_config
|
212
|
+
check_durable_subscription_config
|
213
|
+
raise(LogStash::ConfigurationError, "Threads cannot be > 1 if pub_sub is set") if @threads > 1 && @pub_sub
|
214
|
+
end
|
215
|
+
|
216
|
+
def check_durable_subscription_config
|
217
|
+
return unless @durable_subscriber
|
218
|
+
raise(LogStash::ConfigurationError, "pub_sub must be true if durable_subscriber is set") unless @pub_sub
|
219
|
+
@durable_subscriber_client_id ||= 'Logstash'
|
220
|
+
@durable_subscriber_name ||= destination
|
221
|
+
end
|
222
|
+
|
223
|
+
def run(output_queue)
|
224
|
+
begin
|
225
|
+
connection = JMS::Connection.new(@jms_config)
|
226
|
+
connection.client_id = @durable_subscriber_client_id if @durable_subscriber_client_id
|
227
|
+
session = connection.create_session(@jms_config)
|
228
|
+
connection.start
|
229
|
+
params = {:timeout => @timeout * 1000, :selector => @selector}
|
230
|
+
subscriber = subscriber(session, params)
|
231
|
+
until stop?
|
232
|
+
# This will read from the queue/topic until :timeout is breached, or messages are available whichever comes
|
233
|
+
# first.
|
234
|
+
subscriber.each({:timeout => @interval * 1000}) do |message|
|
235
|
+
queue_event(message, output_queue)
|
236
|
+
break if stop?
|
237
|
+
end
|
238
|
+
end
|
239
|
+
rescue => e
|
240
|
+
logger.warn("JMS Consumer Died", error_hash(e))
|
241
|
+
unless stop?
|
242
|
+
sleep(5)
|
243
|
+
subscriber && subscriber.close
|
244
|
+
session && session.close
|
245
|
+
connection && connection.close
|
246
|
+
retry
|
247
|
+
end
|
248
|
+
ensure
|
249
|
+
subscriber && subscriber.close
|
250
|
+
session && session.close
|
251
|
+
connection && connection.close
|
252
|
+
end
|
253
|
+
end # def run_consumer
|
137
254
|
|
138
255
|
|
139
|
-
private
|
140
256
|
def queue_event(msg, output_queue)
|
141
257
|
begin
|
142
258
|
if @include_body
|
@@ -146,13 +262,13 @@ class LogStash::Inputs::Jms < LogStash::Inputs::Threadable
|
|
146
262
|
event.set(field.to_s, value) # TODO(claveau): needs codec.decode or converter.convert ?
|
147
263
|
end
|
148
264
|
elsif msg.java_kind_of?(JMS::TextMessage) || msg.java_kind_of?(JMS::BytesMessage)
|
149
|
-
|
265
|
+
unless msg.to_s.nil?
|
150
266
|
@codec.decode(msg.to_s) do |event_message|
|
151
267
|
event = event_message
|
152
268
|
end
|
153
269
|
end
|
154
270
|
else
|
155
|
-
@logger.error( "
|
271
|
+
@logger.error( "Unsupported message type #{msg.data.class.to_s}" )
|
156
272
|
end
|
157
273
|
end
|
158
274
|
|
@@ -164,14 +280,14 @@ class LogStash::Inputs::Jms < LogStash::Inputs::Threadable
|
|
164
280
|
end
|
165
281
|
|
166
282
|
if @include_header
|
167
|
-
msg.attributes.each do |field, value|
|
168
|
-
event.set(field.to_s, value)
|
283
|
+
msg.attributes && msg.attributes.each do |field, value|
|
284
|
+
event.set(field.to_s, value) unless @skip_headers.include?(field.to_s)
|
169
285
|
end
|
170
286
|
end
|
171
287
|
|
172
288
|
if @include_properties
|
173
|
-
msg.properties.each do |field, value|
|
174
|
-
event.set(field.to_s, value)
|
289
|
+
msg.properties && msg.properties.each do |field, value|
|
290
|
+
event.set(field.to_s, value) unless @skip_properties.include?(field.to_s)
|
175
291
|
end
|
176
292
|
end
|
177
293
|
|
@@ -180,102 +296,55 @@ class LogStash::Inputs::Jms < LogStash::Inputs::Threadable
|
|
180
296
|
|
181
297
|
rescue => e # parse or event creation error
|
182
298
|
@logger.error("Failed to create event", :message => msg, :exception => e,
|
183
|
-
:backtrace => e.backtrace)
|
299
|
+
:backtrace => e.backtrace)
|
184
300
|
end
|
185
301
|
end
|
186
302
|
|
187
|
-
# Consume all available messages on the queue
|
188
|
-
# sleeps some time, then consume again
|
189
|
-
private
|
190
|
-
def run_consumer(output_queue)
|
191
|
-
JMS::Connection.session(@jms_config) do |session|
|
192
|
-
destination_key = @pub_sub ? :topic_name : :queue_name
|
193
|
-
while !stop?
|
194
|
-
session.consume(destination_key => @destination, :timeout=>@timeout, :selector => @selector, :buffered_message => @oracle_aq_buffered_messages) do |message|
|
195
|
-
queue_event message, output_queue
|
196
|
-
break if stop?
|
197
|
-
end
|
198
|
-
sleep @interval
|
199
|
-
end
|
200
|
-
end
|
201
|
-
rescue => e
|
202
|
-
@logger.warn("JMS Consumer died", :exception => e, :backtrace => e.backtrace)
|
203
|
-
sleep(10)
|
204
|
-
retry unless stop?
|
205
|
-
end # def run_consumer
|
206
|
-
|
207
|
-
# Consume all available messages on the queue through a listener
|
208
|
-
private
|
209
|
-
def run_thread(output_queue)
|
210
|
-
connection = JMS::Connection.new(@jms_config)
|
211
|
-
connection.on_exception do |jms_exception|
|
212
|
-
@logger.warn("JMS Exception has occurred: #{jms_exception}")
|
213
|
-
end
|
214
303
|
|
304
|
+
def subscriber(session, params)
|
215
305
|
destination_key = @pub_sub ? :topic_name : :queue_name
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
@logger.debug("JMS Thread sleeping ...")
|
222
|
-
sleep @interval
|
223
|
-
end
|
224
|
-
rescue => e
|
225
|
-
@logger.warn("JMS Consumer died", :exception => e, :backtrace => e.backtrace)
|
226
|
-
sleep(10)
|
227
|
-
retry unless stop?
|
228
|
-
end # def run_thread
|
229
|
-
|
230
|
-
# Consume all available messages on the queue through a listener
|
231
|
-
private
|
232
|
-
def run_async(output_queue)
|
233
|
-
JMS::Connection.start(@jms_config) do |connection|
|
234
|
-
# Define exception listener
|
235
|
-
# The problem here is that we do not handle any exception
|
236
|
-
connection.on_exception do |jms_exception|
|
237
|
-
@logger.warn("JMS Exception has occurred: #{jms_exception}")
|
238
|
-
raise jms_exception
|
239
|
-
end
|
240
|
-
# Define Asynchronous code block to be called every time a message is received
|
241
|
-
destination_key = @pub_sub ? :topic_name : :queue_name
|
242
|
-
connection.on_message(destination_key => @destination, :selector => @selector) do |message|
|
243
|
-
queue_event message, output_queue
|
244
|
-
end
|
245
|
-
# Since the on_message handler above is in a separate thread the thread needs
|
246
|
-
# to do some other work. It will just sleep for 10 seconds.
|
247
|
-
while !stop?
|
248
|
-
@logger.debug("JMS Thread sleeping ...")
|
249
|
-
sleep @interval
|
250
|
-
end
|
251
|
-
end
|
252
|
-
rescue => e
|
253
|
-
@logger.warn("JMS Consumer died", :exception => e, :backtrace => e.backtrace)
|
254
|
-
sleep(10)
|
255
|
-
retry unless stop?
|
256
|
-
end # def run_async
|
306
|
+
params[destination_key] = @destination
|
307
|
+
queue_or_topic = session.create_destination(params)
|
308
|
+
@durable_subscriber ? durable_subscriber(session, queue_or_topic, params) :
|
309
|
+
regular_subscriber(session, queue_or_topic, params)
|
310
|
+
end
|
257
311
|
|
258
|
-
public
|
259
|
-
def run(output_queue)
|
260
|
-
case @runner
|
261
|
-
when "consumer" then
|
262
|
-
run_consumer(output_queue)
|
263
|
-
when "async" then
|
264
|
-
run_async(output_queue)
|
265
|
-
when "thread" then
|
266
|
-
run_thread(output_queue)
|
267
|
-
end
|
268
|
-
end # def run
|
269
312
|
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
end # def close
|
313
|
+
def durable_subscriber(session, queue_or_topic, params)
|
314
|
+
params[:selector] ? session.create_durable_subscriber(queue_or_topic, @durable_subscriber_name, params[:selector], false) :
|
315
|
+
session.create_durable_subscriber(queue_or_topic, @durable_subscriber_name)
|
316
|
+
end
|
275
317
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
318
|
+
def regular_subscriber(session, queue_or_topic, params)
|
319
|
+
params[:selector] ? session.create_consumer(queue_or_topic, params[:selector]) :
|
320
|
+
session.create_consumer(queue_or_topic)
|
321
|
+
end
|
322
|
+
|
323
|
+
def error_hash(e)
|
324
|
+
error_hash = {:exception => e.class.name, :exception_message => e.message, :backtrace => e.backtrace}
|
325
|
+
root_cause = get_root_cause(e)
|
326
|
+
error_hash[:root_cause] = root_cause unless root_cause.nil?
|
327
|
+
error_hash
|
328
|
+
end
|
329
|
+
|
330
|
+
# JMS Exceptions can contain chains of Exceptions, making it difficult to determine the root cause of an error
|
331
|
+
# without knowing the actual root cause behind the problem.
|
332
|
+
# This method protects against Java Exceptions where the cause methods loop. If there is a cause loop, the last
|
333
|
+
# cause exception before the loop is detected will be returned, along with an entry in the root_cause hash indicating
|
334
|
+
# that an exception loop was detected. This will mean that the root cause may not be the actual root cause of the
|
335
|
+
# problem, and further investigation is required
|
336
|
+
def get_root_cause(e)
|
337
|
+
return nil unless e.respond_to?(:get_cause) && !e.get_cause.nil?
|
338
|
+
cause = e
|
339
|
+
slow_pointer = e
|
340
|
+
# Use a slow pointer to avoid cause loops in Java Exceptions
|
341
|
+
move_slow = false
|
342
|
+
until (next_cause = cause.get_cause).nil?
|
343
|
+
cause = next_cause
|
344
|
+
return {:exception => cause.class.name, :exception_message => cause.message, :exception_loop => true } if cause == slow_pointer
|
345
|
+
slow_pointer = slow_pointer.cause if move_slow
|
346
|
+
move_slow = !move_slow
|
347
|
+
end
|
348
|
+
{:exception => cause.class.name, :exception_message => cause.message }
|
349
|
+
end
|
281
350
|
end # class LogStash::Inputs::Jms
|
data/logstash-input-jms.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-input-jms'
|
4
|
-
s.version = '3.0
|
4
|
+
s.version = '3.1.0'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "Reads events from a Jms Broker"
|
7
7
|
s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
|
@@ -0,0 +1,132 @@
|
|
1
|
+
<!--
|
2
|
+
Licensed to the Apache Software Foundation (ASF) under one or more
|
3
|
+
contributor license agreements. See the NOTICE file distributed with
|
4
|
+
this work for additional information regarding copyright ownership.
|
5
|
+
The ASF licenses this file to You under the Apache License, Version 2.0
|
6
|
+
(the "License"); you may not use this file except in compliance with
|
7
|
+
the License. You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
16
|
+
-->
|
17
|
+
<!-- START SNIPPET: example -->
|
18
|
+
<beans
|
19
|
+
xmlns="http://www.springframework.org/schema/beans"
|
20
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
21
|
+
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
22
|
+
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
|
23
|
+
|
24
|
+
<!-- Allows us to use system properties as variables in this configuration file -->
|
25
|
+
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
|
26
|
+
<property name="locations">
|
27
|
+
<value>file:${activemq.conf}/credentials.properties</value>
|
28
|
+
</property>
|
29
|
+
</bean>
|
30
|
+
|
31
|
+
<!-- Allows accessing the server log -->
|
32
|
+
<bean id="logQuery" class="io.fabric8.insight.log.log4j.Log4jLogQuery"
|
33
|
+
lazy-init="false" scope="singleton"
|
34
|
+
init-method="start" destroy-method="stop">
|
35
|
+
</bean>
|
36
|
+
|
37
|
+
<!--
|
38
|
+
The <broker> element is used to configure the ActiveMQ broker.
|
39
|
+
-->
|
40
|
+
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
|
41
|
+
|
42
|
+
<destinationPolicy>
|
43
|
+
<policyMap>
|
44
|
+
<policyEntries>
|
45
|
+
<policyEntry topic=">" >
|
46
|
+
<!-- The constantPendingMessageLimitStrategy is used to prevent
|
47
|
+
slow topic consumers to block producers and affect other consumers
|
48
|
+
by limiting the number of messages that are retained
|
49
|
+
For more information, see:
|
50
|
+
|
51
|
+
http://activemq.apache.org/slow-consumer-handling.html
|
52
|
+
|
53
|
+
-->
|
54
|
+
<pendingMessageLimitStrategy>
|
55
|
+
<constantPendingMessageLimitStrategy limit="1000"/>
|
56
|
+
</pendingMessageLimitStrategy>
|
57
|
+
</policyEntry>
|
58
|
+
</policyEntries>
|
59
|
+
</policyMap>
|
60
|
+
</destinationPolicy>
|
61
|
+
|
62
|
+
|
63
|
+
<!--
|
64
|
+
The managementContext is used to configure how ActiveMQ is exposed in
|
65
|
+
JMX. By default, ActiveMQ uses the MBean server that is started by
|
66
|
+
the JVM. For more information, see:
|
67
|
+
|
68
|
+
http://activemq.apache.org/jmx.html
|
69
|
+
-->
|
70
|
+
<managementContext>
|
71
|
+
<managementContext createConnector="false"/>
|
72
|
+
</managementContext>
|
73
|
+
|
74
|
+
<!--
|
75
|
+
Configure message persistence for the broker. The default persistence
|
76
|
+
mechanism is the KahaDB store (identified by the kahaDB tag).
|
77
|
+
For more information, see:
|
78
|
+
|
79
|
+
http://activemq.apache.org/persistence.html
|
80
|
+
-->
|
81
|
+
<persistenceAdapter>
|
82
|
+
<kahaDB directory="${activemq.data}/kahadb"/>
|
83
|
+
</persistenceAdapter>
|
84
|
+
|
85
|
+
|
86
|
+
<!--
|
87
|
+
The systemUsage controls the maximum amount of space the broker will
|
88
|
+
use before disabling caching and/or slowing down producers. For more information, see:
|
89
|
+
http://activemq.apache.org/producer-flow-control.html
|
90
|
+
-->
|
91
|
+
<systemUsage>
|
92
|
+
<systemUsage>
|
93
|
+
<memoryUsage>
|
94
|
+
<memoryUsage percentOfJvmHeap="70" />
|
95
|
+
</memoryUsage>
|
96
|
+
<storeUsage>
|
97
|
+
<storeUsage limit="100 gb"/>
|
98
|
+
</storeUsage>
|
99
|
+
<tempUsage>
|
100
|
+
<tempUsage limit="50 gb"/>
|
101
|
+
</tempUsage>
|
102
|
+
</systemUsage>
|
103
|
+
</systemUsage>
|
104
|
+
|
105
|
+
<!--
|
106
|
+
The transport connectors expose ActiveMQ over a given protocol to
|
107
|
+
clients and other brokers. For more information, see:
|
108
|
+
|
109
|
+
http://activemq.apache.org/configuring-transports.html
|
110
|
+
-->
|
111
|
+
<transportConnectors>
|
112
|
+
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
|
113
|
+
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
|
114
|
+
</transportConnectors>
|
115
|
+
|
116
|
+
<!-- destroy the spring context on shutdown to stop jetty -->
|
117
|
+
<shutdownHooks>
|
118
|
+
<bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
|
119
|
+
</shutdownHooks>
|
120
|
+
|
121
|
+
</broker>
|
122
|
+
|
123
|
+
<!--
|
124
|
+
Enable web consoles, REST and Ajax APIs and demos
|
125
|
+
The web consoles requires by default login, you can disable this in the jetty.xml file
|
126
|
+
|
127
|
+
Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details
|
128
|
+
-->
|
129
|
+
<import resource="jetty.xml"/>
|
130
|
+
|
131
|
+
</beans>
|
132
|
+
<!-- END SNIPPET: example -->
|