fmq 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +15 -1
- data/README.txt +2 -1
- data/bin/fmq +3 -6
- data/config/hoe.rb +3 -3
- data/default-server/admin-interface/index.html +45 -235
- data/default-server/admin-interface/javascript/application.js +127 -0
- data/default-server/admin-interface/stylesheets/application.css +61 -0
- data/default-server/config.ru +86 -0
- data/lib/fmq/admin.rb +96 -0
- data/lib/fmq/boot.rb +6 -60
- data/lib/fmq/queue_manager.rb +43 -50
- data/lib/fmq/queues/forward.rb +2 -2
- data/lib/fmq/server.rb +144 -0
- data/lib/fmq/version.rb +1 -1
- data/lib/fmq.rb +2 -7
- data/test/test_queue_manager.rb +16 -23
- metadata +19 -8
- data/default-server/config.yml +0 -74
- data/lib/fmq/mongrel_server.rb +0 -172
- data/lib/fmq/queues/admin.rb +0 -94
- /data/default-server/admin-interface/{prototype.js → javascript/prototype.js} +0 -0
data/History.txt
CHANGED
@@ -1,4 +1,17 @@
|
|
1
|
+
== 0.3.0 2008-08-06
|
2
|
+
|
3
|
+
* 2 minor changes:
|
4
|
+
* replaced the mongrel handler by rack so that it can be used by many servers and in different configurations
|
5
|
+
* removed the old yml style config and replaced it by a new rubyish config style (see config.ru)
|
6
|
+
* 5 tiny changes:
|
7
|
+
* seperated the admin interface handler
|
8
|
+
* removed the configuration stuff that belonged to the old yml file from queue_manager and boot classes
|
9
|
+
* removed that the command fmq can be used to start the server (rackup can be used by now)
|
10
|
+
* admin interface is now seperated to several files (javascript, css, ...)
|
11
|
+
* admin interface is validated by W3C validatior for xhtml strict and css 2.1 compliance
|
12
|
+
|
1
13
|
== 0.2.0 2008-06-28
|
14
|
+
|
2
15
|
* 3 minor enhancements:
|
3
16
|
* added a BaseQueue that can be used by other queues to reduce overhead
|
4
17
|
* created unit test for most important classes
|
@@ -9,6 +22,7 @@
|
|
9
22
|
* update some parts of the website and admin interface
|
10
23
|
|
11
24
|
== 0.1.1 2008-06-23
|
25
|
+
|
12
26
|
* 7 tiny enhancements:
|
13
27
|
* make the queue manager check if the poll or put to or from a queue is possible
|
14
28
|
* changed mongrel handler to no raise an exception on client error (performance issue)
|
@@ -21,4 +35,4 @@
|
|
21
35
|
== 0.1.0 2008-06-22
|
22
36
|
|
23
37
|
* 1 minor enhancement:
|
24
|
-
* This is the initial release
|
38
|
+
* This is the initial release
|
data/README.txt
CHANGED
@@ -34,11 +34,12 @@ stores it’s internal data in an FIFO in system memory.
|
|
34
34
|
== FEATURES/PROBLEMS:
|
35
35
|
|
36
36
|
* FIFO message store
|
37
|
-
* easy setup and
|
37
|
+
* easy setup and maintenance of system
|
38
38
|
* using http for communication
|
39
39
|
* changeable queue implementation
|
40
40
|
* ruby client lib
|
41
41
|
* simple ajax admin interface
|
42
|
+
* implements a rack server stack
|
42
43
|
|
43
44
|
== SYNOPSIS:
|
44
45
|
|
data/bin/fmq
CHANGED
@@ -19,9 +19,8 @@
|
|
19
19
|
#
|
20
20
|
# == Command line options
|
21
21
|
#
|
22
|
-
# usage: /usr/bin/fmq
|
22
|
+
# usage: /usr/bin/fmq create <project_name>
|
23
23
|
#
|
24
|
-
# * Invocation without parameter will start server
|
25
24
|
# * Invocation with parameter <em>create</em> *project_name*
|
26
25
|
# will create a project folder with the name *project_name*
|
27
26
|
begin
|
@@ -32,12 +31,10 @@ rescue LoadError
|
|
32
31
|
end
|
33
32
|
|
34
33
|
if File.basename($0) == "fmq" then
|
35
|
-
if ARGV.size == 0 then
|
36
|
-
FreeMessageQueue::Boot.start_server
|
37
|
-
elsif ARGV.size == 2 && ARGV[0] == "create" then
|
34
|
+
if ARGV.size == 2 && ARGV[0] == "create" then
|
38
35
|
FreeMessageQueue::Boot.create_project(ARGV[1])
|
39
36
|
else
|
40
|
-
puts "usage: #{$0}
|
37
|
+
puts "usage: #{$0} create <project_name>"
|
41
38
|
end
|
42
39
|
end
|
43
40
|
|
data/config/hoe.rb
CHANGED
@@ -8,7 +8,7 @@ RUBYFORGE_PROJECT = 'fmq' # The unix name for your project
|
|
8
8
|
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
9
9
|
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
10
10
|
EXTRA_DEPENDENCIES = [
|
11
|
-
|
11
|
+
['rack', '>= 0.4.0']
|
12
12
|
] # An array of rubygem dependencies [name, version]
|
13
13
|
|
14
14
|
@config_file = "~/.rubyforge/user-config.yml"
|
@@ -61,7 +61,7 @@ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
61
61
|
|
62
62
|
# == Optional
|
63
63
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
64
|
-
|
64
|
+
p.extra_deps = EXTRA_DEPENDENCIES
|
65
65
|
|
66
66
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
67
67
|
end
|
@@ -70,4 +70,4 @@ CHANGES = $hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
|
|
70
70
|
PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
|
71
71
|
$hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
|
72
72
|
$hoe.rsync_args = '-av --delete --ignore-errors'
|
73
|
-
$hoe.spec.post_install_message = File.open(File.dirname(__FILE__) + "/../PostInstall.txt").read rescue ""
|
73
|
+
$hoe.spec.post_install_message = File.open(File.dirname(__FILE__) + "/../PostInstall.txt").read rescue ""
|
@@ -1,240 +1,50 @@
|
|
1
|
-
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
2
3
|
<head>
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
onFailure: function(transport){ alert(transport.getHeader("ERROR")) }
|
23
|
-
});
|
24
|
-
}
|
25
|
-
|
26
|
-
function updateTable() {
|
27
|
-
new Ajax.Request(ADMIN_QUEUE_PATH, {
|
28
|
-
method:'GET',
|
29
|
-
onSuccess: function(transport) {
|
30
|
-
queues = transport.responseText.evalJSON();
|
31
|
-
fillTableSpaceWithQueues("queue-table-space", queues);
|
32
|
-
},
|
33
|
-
onFailure: function(transport){ alert(transport.getHeader("ERROR")) }
|
34
|
-
});
|
35
|
-
}
|
4
|
+
<title>Free Message Queue</title>
|
5
|
+
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
6
|
+
<link rel="shortcut icon" href="images/logo.png" />
|
7
|
+
<link href="stylesheets/application.css" rel="stylesheet" type="text/css" />
|
8
|
+
<script type="text/javascript" src="javascript/prototype.js"></script>
|
9
|
+
<script type="text/javascript" src="javascript/application.js"></script>
|
10
|
+
</head>
|
11
|
+
<body onload="updateSelects(); updateTable();">
|
12
|
+
<div id="container">
|
13
|
+
<div id="header">
|
14
|
+
<div id="logo"></div>
|
15
|
+
<h1>Free Message Queue - Admin Interface</h1>
|
16
|
+
<h3>the easy http queue system for ruby and all others ...</h3>
|
17
|
+
</div>
|
18
|
+
<div id="content">
|
19
|
+
<!-- LIST QUEUE -->
|
20
|
+
<h1>Queues</h1>
|
21
|
+
<p id="queue-table-space"></p>
|
22
|
+
<input type="button" value="update" onclick="updateTable();" />
|
36
23
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
queue[4] +'</td><td><input type="button" value="delete" onClick="deleteQueue(\'' + queue[0] + '\');"/></td></tr>';
|
44
|
-
});
|
45
|
-
|
46
|
-
table += '</table>';
|
47
|
-
|
48
|
-
$(table_space).innerHTML = table;
|
49
|
-
}
|
50
|
-
|
51
|
-
function fillSelectWithQueuePaths(select_id, queues) {
|
52
|
-
// remove all current
|
53
|
-
while ($(select_id).hasChildNodes()) {
|
54
|
-
$(select_id).removeChild($(select_id).lastChild);
|
55
|
-
}
|
56
|
-
|
57
|
-
queues.each ( function (queue) {
|
58
|
-
elem = document.createElement("option");
|
59
|
-
elem.label = elem.value = elem.text = queue[0];
|
60
|
-
$(select_id).appendChild(elem);
|
61
|
-
});
|
62
|
-
}
|
63
|
-
|
64
|
-
function getMessageFromQueue(button_id, select_id, output_id) {
|
65
|
-
new Ajax.Request($(select_id).value, {
|
66
|
-
method:'GET',
|
67
|
-
onLoading: function(transport) {
|
68
|
-
toggle_element(button_id);
|
69
|
-
},
|
70
|
-
onSuccess: function(transport) {
|
71
|
-
if (transport.status == 200) {
|
72
|
-
$(output_id).innerHTML = transport.responseText;
|
73
|
-
updateTable();
|
74
|
-
} else {
|
75
|
-
alert("There is no message in the queue");
|
76
|
-
$(output_id).innerHTML = " == NO MESSAGE IN THE QUEUE ==";
|
77
|
-
}
|
78
|
-
toggle_element(button_id);
|
79
|
-
},
|
80
|
-
onFailure: function(transport){
|
81
|
-
alert(transport.getHeader("ERROR"));
|
82
|
-
toggle_element(button_id);
|
83
|
-
}
|
84
|
-
});
|
85
|
-
}
|
86
|
-
|
87
|
-
function sendMessageToQueue(button_id, select_id, input_id) {
|
88
|
-
new Ajax.Request($(select_id).value, {
|
89
|
-
method:'POST',
|
90
|
-
postBody: $(input_id).value,
|
91
|
-
onLoading: function(transport) {
|
92
|
-
toggle_element(button_id);
|
93
|
-
},
|
94
|
-
onSuccess: function(transport) {
|
95
|
-
updateTable();
|
96
|
-
toggle_element(button_id);
|
97
|
-
},
|
98
|
-
onFailure: function(transport) {
|
99
|
-
alert(transport.getHeader("ERROR"));
|
100
|
-
toggle_element(button_id);
|
101
|
-
}
|
102
|
-
});
|
103
|
-
}
|
24
|
+
<!-- CREATE QUEUE -->
|
25
|
+
<h1>Create queue</h1>
|
26
|
+
<p>Queue path: /<input id="queue-create-path" /></p>
|
27
|
+
<p>Maximum messages: <input id="queue-create-max-messages" value="1000000" /></p>
|
28
|
+
<p>Maximum queue size in kb, mb, gb: <input id="queue-create-size" value="100mb" /></p>
|
29
|
+
<input type="button" value="create" onclick="createQueue()" />
|
104
30
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
new Ajax.Request(ADMIN_QUEUE_PATH, {
|
113
|
-
method: 'POST',
|
114
|
-
postBody: "_method=create&data=" + Object.toJSON(config),
|
115
|
-
onSuccess: function(transport) {
|
116
|
-
updateSelects();
|
117
|
-
updateTable();
|
118
|
-
alert("Queue /" + $("queue-create-path").value + " created successfully");
|
119
|
-
},
|
120
|
-
onFailure: function(transport){ alert(transport.getHeader("ERROR")) }
|
121
|
-
});
|
122
|
-
}
|
31
|
+
<!-- SEND MESSAGE TO QUEUE -->
|
32
|
+
<h1>Send message to queue</h1>
|
33
|
+
<p>Queue path: <select id="post-queue-name"><option>NONE</option></select></p>
|
34
|
+
<p><textarea id="post-body" class="block-text" rows="5" cols="80" style="width: 780px; height: 100px;"></textarea></p>
|
35
|
+
<input id="post-button" type="button" value="send"
|
36
|
+
onclick="sendMessageToQueue('post-button', 'post-queue-name', 'post-body');"/>
|
123
37
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
}
|
136
|
-
</script>
|
137
|
-
<style type="text/css" id="test">
|
138
|
-
body {
|
139
|
-
background-color: #687486;
|
140
|
-
font-family: arial;
|
141
|
-
font-size: 1em;
|
142
|
-
}
|
143
|
-
img {
|
144
|
-
border: 0px;
|
145
|
-
}
|
146
|
-
a {
|
147
|
-
color: #C7DAD1;
|
148
|
-
}
|
149
|
-
#container {
|
150
|
-
margin: 10px auto;
|
151
|
-
background-color: #C7DAD1;
|
152
|
-
width: 800px;
|
153
|
-
border: 1px solid #292C44;
|
154
|
-
}
|
155
|
-
#header {
|
156
|
-
background-color: #2F3B4E;
|
157
|
-
padding: 20px 20px 20px 30px;
|
158
|
-
color: #C7DAD1;
|
159
|
-
}
|
160
|
-
#logo {
|
161
|
-
width: 64px;
|
162
|
-
height: 64px;
|
163
|
-
float: right;
|
164
|
-
margin-top: 20px;
|
165
|
-
margin-right: 20px;
|
166
|
-
background-image: url(images/logo.png);
|
167
|
-
}
|
168
|
-
#content {
|
169
|
-
padding: 10px;
|
170
|
-
}
|
171
|
-
#content h1 {
|
172
|
-
font-size: 1.4em;
|
173
|
-
}
|
174
|
-
#footer {
|
175
|
-
color: #C7DAD1;
|
176
|
-
background-color: #2F3B4E;
|
177
|
-
text-align: center;
|
178
|
-
padding: 10px;
|
179
|
-
font-weight: bold;
|
180
|
-
}
|
181
|
-
.block-text {
|
182
|
-
font-family:"Courier New", Courier, monospace;
|
183
|
-
border: 1px dashed #C7DAD1;
|
184
|
-
background-color: #000;
|
185
|
-
color: #C7DAD1;
|
186
|
-
padding: 5px;
|
187
|
-
font-size: 0.8em;
|
188
|
-
}
|
189
|
-
th {
|
190
|
-
text-align: left;
|
191
|
-
background-color: #2F3B4E;
|
192
|
-
color: #C7DAD1;
|
193
|
-
padding: 5px;
|
194
|
-
}
|
195
|
-
td {
|
196
|
-
text-align: center;
|
197
|
-
padding: 5px;
|
198
|
-
}
|
199
|
-
</style>
|
200
|
-
</head>
|
201
|
-
<body onLoad="updateSelects(); updateTable();">
|
202
|
-
<div id="container">
|
203
|
-
<div id="header">
|
204
|
-
<div id="logo"></div>
|
205
|
-
<h1>Free Message Queue - Admin Interface</h1>
|
206
|
-
<h3>the easy http queue system for ruby and all others ...</h3>
|
207
|
-
</div>
|
208
|
-
<div id="content">
|
209
|
-
<!-- LIST QUEUE -->
|
210
|
-
<h1>Queues</h1>
|
211
|
-
<p><div id="queue-table-space"></div></p>
|
212
|
-
<input type="button" value="update" onClick="updateTable();" />
|
213
|
-
|
214
|
-
<!-- CREATE QUEUE -->
|
215
|
-
<h1>Create queue</h1>
|
216
|
-
<p>Queue path: /<input id="queue-create-path" /></p>
|
217
|
-
<p>Maximum messages: <input id="queue-create-max-messages" value="1000000" /></p>
|
218
|
-
<p>Maximum queue size in kb, mb, gb: <input id="queue-create-size" value="100mb" /></p>
|
219
|
-
<input type="button" value="create" onClick="createQueue()" />
|
220
|
-
|
221
|
-
<!-- SEND MESSAGE TO QUEUE -->
|
222
|
-
<h1>Send message to queue</h1>
|
223
|
-
<p>Queue path: <select id="select-message-send"></select></p>
|
224
|
-
<p><textarea id="queue-message-send" class="block-text" style="width: 780px; height: 100px;"></textarea></p>
|
225
|
-
<input id="send-message-queue-button" type="button" value="send"
|
226
|
-
onClick="sendMessageToQueue('send-message-queue-button', 'select-message-send', 'queue-message-send');"/>
|
227
|
-
|
228
|
-
<!-- GET MESSAGE FROM QUEUE -->
|
229
|
-
<h1>Get a message from queue</h1>
|
230
|
-
<p>Queue path: <select id="select-message-receive"></select></p>
|
231
|
-
<pre id="queue-message-get" class="block-text"></pre>
|
232
|
-
<input id="get-message-queue-button" type="button" value="get one"
|
233
|
-
onClick="getMessageFromQueue('get-message-queue-button', 'select-message-receive', 'queue-message-get');"/>
|
234
|
-
</div>
|
235
|
-
<div id="footer">
|
236
|
-
This interface is based on <a href="http://www.prototypejs.org/">prototype</a>
|
237
|
-
</div>
|
238
|
-
</div>
|
38
|
+
<!-- GET MESSAGE FROM QUEUE -->
|
39
|
+
<h1>Get a message from queue</h1>
|
40
|
+
<p>Queue path: <select id="get-queue-name"><option>NONE</option></select></p>
|
41
|
+
<pre id="get-body" class="block-text"></pre>
|
42
|
+
<input id="get-button" type="button" value="get one"
|
43
|
+
onclick="getMessageFromQueue('get-button', 'get-queue-name', 'get-body');"/>
|
44
|
+
</div>
|
45
|
+
<div id="footer">
|
46
|
+
This interface is based on <a href="http://www.prototypejs.org/">prototype</a>
|
47
|
+
</div>
|
48
|
+
</div>
|
239
49
|
</body>
|
240
|
-
</html>
|
50
|
+
</html>
|
@@ -0,0 +1,127 @@
|
|
1
|
+
var ADMIN_QUEUE_PATH = '/admin/backend';
|
2
|
+
|
3
|
+
function toggle_element (element_id) {
|
4
|
+
$(element_id).disabled = !$(element_id).disabled;
|
5
|
+
}
|
6
|
+
|
7
|
+
function updateSelects() {
|
8
|
+
new Ajax.Request(ADMIN_QUEUE_PATH, {
|
9
|
+
method:'GET',
|
10
|
+
onSuccess: function(transport) {
|
11
|
+
queues = transport.responseText.evalJSON();
|
12
|
+
fillSelectWithQueuePaths("get-queue-name", queues);
|
13
|
+
fillSelectWithQueuePaths("post-queue-name", queues);
|
14
|
+
fillTableSpaceWithQueues("queue-table-space", queues);
|
15
|
+
},
|
16
|
+
onFailure: function(transport){ alert(transport.getHeader("ERROR")) }
|
17
|
+
});
|
18
|
+
}
|
19
|
+
|
20
|
+
function updateTable() {
|
21
|
+
new Ajax.Request(ADMIN_QUEUE_PATH, {
|
22
|
+
method:'GET',
|
23
|
+
onSuccess: function(transport) {
|
24
|
+
queues = transport.responseText.evalJSON();
|
25
|
+
fillTableSpaceWithQueues("queue-table-space", queues);
|
26
|
+
},
|
27
|
+
onFailure: function(transport){ alert(transport.getHeader("ERROR")) }
|
28
|
+
});
|
29
|
+
}
|
30
|
+
|
31
|
+
function fillTableSpaceWithQueues(table_space, queues) {
|
32
|
+
var table = '<table style="width: 100%; border: 1px solid #292C44">' +
|
33
|
+
'<tr><th>Queue name</th><th>queue size</th><th>messages in queue</th><th>options</th></tr>';
|
34
|
+
|
35
|
+
queues.each ( function (queue) {
|
36
|
+
table += "<tr><td>" + queue[0] + "</td><td>" + queue[1] + "/" + queue[2] +"</td><td>" + queue[3] + "/" +
|
37
|
+
queue[4] +'</td><td><input type="button" value="delete" onClick="deleteQueue(\'' + queue[0] + '\');"/></td></tr>';
|
38
|
+
});
|
39
|
+
|
40
|
+
table += '</table>';
|
41
|
+
|
42
|
+
$(table_space).innerHTML = table;
|
43
|
+
}
|
44
|
+
|
45
|
+
function fillSelectWithQueuePaths(select_id, queues) {
|
46
|
+
// remove all current
|
47
|
+
while ($(select_id).hasChildNodes()) {
|
48
|
+
$(select_id).removeChild($(select_id).lastChild);
|
49
|
+
}
|
50
|
+
|
51
|
+
queues.each ( function (queue) {
|
52
|
+
elem = document.createElement("option");
|
53
|
+
elem.label = elem.value = elem.text = queue[0];
|
54
|
+
$(select_id).appendChild(elem);
|
55
|
+
});
|
56
|
+
}
|
57
|
+
|
58
|
+
function getMessageFromQueue(button_id, select_id, output_id) {
|
59
|
+
new Ajax.Request($(select_id).value, {
|
60
|
+
method:'GET',
|
61
|
+
onLoading: function(transport) {
|
62
|
+
toggle_element(button_id);
|
63
|
+
},
|
64
|
+
onSuccess: function(transport) {
|
65
|
+
if (transport.status == 200) {
|
66
|
+
$(output_id).innerHTML = transport.responseText;
|
67
|
+
updateTable();
|
68
|
+
} else {
|
69
|
+
alert("There is no message in the queue");
|
70
|
+
$(output_id).innerHTML = " == NO MESSAGE IN THE QUEUE ==";
|
71
|
+
}
|
72
|
+
toggle_element(button_id);
|
73
|
+
},
|
74
|
+
onFailure: function(transport){
|
75
|
+
alert(transport.getHeader("ERROR"));
|
76
|
+
toggle_element(button_id);
|
77
|
+
}
|
78
|
+
});
|
79
|
+
}
|
80
|
+
|
81
|
+
function sendMessageToQueue(button_id, select_id, input_id) {
|
82
|
+
new Ajax.Request($(select_id).value, {
|
83
|
+
method:'POST',
|
84
|
+
postBody: $(input_id).value,
|
85
|
+
contentType: "text/plain",
|
86
|
+
onLoading: function(transport) {
|
87
|
+
toggle_element(button_id);
|
88
|
+
},
|
89
|
+
onSuccess: function(transport) {
|
90
|
+
updateTable();
|
91
|
+
toggle_element(button_id);
|
92
|
+
},
|
93
|
+
onFailure: function(transport) {
|
94
|
+
alert(transport.getHeader("ERROR"));
|
95
|
+
toggle_element(button_id);
|
96
|
+
}
|
97
|
+
});
|
98
|
+
}
|
99
|
+
|
100
|
+
function createQueue() {
|
101
|
+
new Ajax.Request(ADMIN_QUEUE_PATH, {
|
102
|
+
method: 'POST',
|
103
|
+
postBody: "_method=create" +
|
104
|
+
"&path=" + "/" + $("queue-create-path").value +
|
105
|
+
"&max_messages=" + parseInt($("queue-create-max-messages").value) +
|
106
|
+
"&max_size=" + $("queue-create-size").value,
|
107
|
+
onSuccess: function(transport) {
|
108
|
+
updateSelects();
|
109
|
+
updateTable();
|
110
|
+
alert("Queue /" + $("queue-create-path").value + " created successfully");
|
111
|
+
},
|
112
|
+
onFailure: function(transport){ alert(transport.getHeader("ERROR")) }
|
113
|
+
});
|
114
|
+
}
|
115
|
+
|
116
|
+
function deleteQueue(path) {
|
117
|
+
new Ajax.Request(ADMIN_QUEUE_PATH, {
|
118
|
+
method: 'POST',
|
119
|
+
postBody: "_method=delete&path=" + path,
|
120
|
+
onSuccess: function(transport) {
|
121
|
+
updateSelects();
|
122
|
+
updateTable();
|
123
|
+
alert("Queue " + path + " successfully deleted");
|
124
|
+
},
|
125
|
+
onFailure: function(transport){ alert(transport.getHeader("ERROR")) }
|
126
|
+
});
|
127
|
+
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
body {
|
2
|
+
background-color: #687486;
|
3
|
+
font-family: arial;
|
4
|
+
font-size: 1em;
|
5
|
+
}
|
6
|
+
img {
|
7
|
+
border: 0px;
|
8
|
+
}
|
9
|
+
a {
|
10
|
+
color: #C7DAD1;
|
11
|
+
}
|
12
|
+
#container {
|
13
|
+
margin: 10px auto;
|
14
|
+
background-color: #C7DAD1;
|
15
|
+
width: 800px;
|
16
|
+
border: 1px solid #292C44;
|
17
|
+
}
|
18
|
+
#header {
|
19
|
+
background-color: #2F3B4E;
|
20
|
+
padding: 20px 20px 20px 30px;
|
21
|
+
color: #C7DAD1;
|
22
|
+
}
|
23
|
+
#logo {
|
24
|
+
width: 64px;
|
25
|
+
height: 64px;
|
26
|
+
float: right;
|
27
|
+
margin-top: 20px;
|
28
|
+
margin-right: 20px;
|
29
|
+
background-image: url(../images/logo.png);
|
30
|
+
}
|
31
|
+
#content {
|
32
|
+
padding: 10px;
|
33
|
+
}
|
34
|
+
#content h1 {
|
35
|
+
font-size: 1.4em;
|
36
|
+
}
|
37
|
+
#footer {
|
38
|
+
color: #C7DAD1;
|
39
|
+
background-color: #2F3B4E;
|
40
|
+
text-align: center;
|
41
|
+
padding: 10px;
|
42
|
+
font-weight: bold;
|
43
|
+
}
|
44
|
+
.block-text {
|
45
|
+
font-family:"Courier New", Courier, monospace;
|
46
|
+
border: 1px dashed #C7DAD1;
|
47
|
+
background-color: #000;
|
48
|
+
color: #C7DAD1;
|
49
|
+
padding: 5px;
|
50
|
+
font-size: 0.8em;
|
51
|
+
}
|
52
|
+
th {
|
53
|
+
text-align: left;
|
54
|
+
background-color: #2F3B4E;
|
55
|
+
color: #C7DAD1;
|
56
|
+
padding: 5px;
|
57
|
+
}
|
58
|
+
td {
|
59
|
+
text-align: center;
|
60
|
+
padding: 5px;
|
61
|
+
}
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require "fmq"
|
2
|
+
|
3
|
+
# load all local queues (from project directory)
|
4
|
+
Dir.glob("queues/*.rb").each { |f| require f }
|
5
|
+
|
6
|
+
# setup log level of free message queue
|
7
|
+
FreeMessageQueue.log_level("info")
|
8
|
+
|
9
|
+
# =====================================================
|
10
|
+
# create and configure the queue manager
|
11
|
+
# =====================================================
|
12
|
+
queue_manager = FreeMessageQueue::QueueManager.new()
|
13
|
+
|
14
|
+
queue_manager.setup do |qm|
|
15
|
+
# if someone pushes to a queue that don't exists
|
16
|
+
# the queue manager will create one for you if the option
|
17
|
+
# <em>auto_create_queues</em> is <b>true</b>. This
|
18
|
+
# is a useful option if you are in development,
|
19
|
+
# the queue will be a FreeMessageQueue::SyncronizedQueue by default
|
20
|
+
qm.auto_create_queues = true
|
21
|
+
|
22
|
+
# =====================================================
|
23
|
+
# if you want some queues right from startup
|
24
|
+
# define there url and constraints here
|
25
|
+
# =====================================================
|
26
|
+
|
27
|
+
qm.setup_queue do |q|
|
28
|
+
# the path to the queue e.g. /app1/myframe/test1
|
29
|
+
# means http://localhost:5884/app1/myframe/test1
|
30
|
+
# this parameter is not optional
|
31
|
+
q.path = "/fmq_test/test1"
|
32
|
+
# this defines the maximum count of messages that
|
33
|
+
# can be in the queue, if the queue is full every
|
34
|
+
# new message will be rejected with a http error
|
35
|
+
# this parameter is optional if you don't specify
|
36
|
+
# a max value the queue size depends on your system
|
37
|
+
q.max_messages = 1000000
|
38
|
+
# this optional to and specifys the max content size
|
39
|
+
# for all data of a queue
|
40
|
+
# valid extensions are kb, mb, gb
|
41
|
+
q.max_size = "10kb"
|
42
|
+
end
|
43
|
+
|
44
|
+
# if you want you can specify the class of the queue
|
45
|
+
# this is interessting if you write your own queues
|
46
|
+
qm.setup_queue FreeMessageQueue::LoadBalancedQueue do |q|
|
47
|
+
q.path = "/fmq_test/test2"
|
48
|
+
end
|
49
|
+
|
50
|
+
# if you have special queues include put them into the queues
|
51
|
+
# folder and and use them (this MyTestQueue is places in queues/mytest.rb)
|
52
|
+
qm.setup_queue MyTestQueue do |q|
|
53
|
+
q.path = "/fmq_test/test3"
|
54
|
+
end
|
55
|
+
|
56
|
+
# this is a forwarding queue wich forwards one message
|
57
|
+
# to some other queues
|
58
|
+
qm.setup_queue FreeMessageQueue::ForwardQueue do |q|
|
59
|
+
q.path = "/fmq_test/forward_to_1_and_2"
|
60
|
+
# you can add as may queues as you want
|
61
|
+
# but seperate them with a space char
|
62
|
+
q.forward_to = ["/fmq_test/test1", "/fmq_test/test2"]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# =====================================================
|
67
|
+
# setup the ajax admin interface
|
68
|
+
# =====================================================
|
69
|
+
|
70
|
+
# handle requests to remove, create, update queues
|
71
|
+
map "/admin/backend" do
|
72
|
+
run FreeMessageQueue::AdminInterface.new(queue_manager)
|
73
|
+
end
|
74
|
+
|
75
|
+
# serve static files in admin-interface folder
|
76
|
+
map "/admin" do
|
77
|
+
run Rack::File.new("./admin-interface")
|
78
|
+
end
|
79
|
+
|
80
|
+
# =====================================================
|
81
|
+
# install the server for the queue maneger
|
82
|
+
# =====================================================
|
83
|
+
|
84
|
+
map "/" do
|
85
|
+
run FreeMessageQueue::Server.new(queue_manager)
|
86
|
+
end
|