jubilee 2.1.0.beta-java → 2.1.0.rc1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +13 -1
  3. data/README.md +65 -54
  4. data/Rakefile +23 -21
  5. data/examples/chatapp/Gemfile +1 -2
  6. data/examples/chatapp/Gemfile.lock +2 -2
  7. data/examples/chatapp/README.md +14 -2
  8. data/examples/chatapp/app.rb +1 -0
  9. data/examples/chatapp/config.json +4 -0
  10. data/examples/chatapp/config.ru +0 -2
  11. data/jars/annotations-1.3.2.jar +0 -0
  12. data/jars/lang-jruby-2.1.0-final.jar +0 -0
  13. data/jars/log4j-1.2.16.jar +0 -0
  14. data/jars/slf4j-api-1.6.2.jar +0 -0
  15. data/jars/vertx-core-2.1.2.jar +0 -0
  16. data/jars/{vertx-hazelcast-2.1.1.jar → vertx-hazelcast-2.1.2.jar} +0 -0
  17. data/jars/{vertx-platform-2.1.1.jar → vertx-platform-2.1.2.jar} +0 -0
  18. data/lib/container.rb +117 -0
  19. data/lib/{vertx → core}/buffer.rb +1 -1
  20. data/lib/core/datagram.rb +280 -0
  21. data/lib/core/dns.rb +143 -0
  22. data/lib/{vertx → core}/event_bus.rb +79 -8
  23. data/lib/core/file_system.rb +479 -0
  24. data/lib/{vertx → core}/http.rb +635 -5
  25. data/lib/core/net.rb +251 -0
  26. data/lib/core/network_support.rb +77 -0
  27. data/lib/core/parsetools.rb +105 -0
  28. data/lib/{vertx → core}/shared_data.rb +2 -2
  29. data/lib/core/sock_js.rb +116 -0
  30. data/lib/{vertx → core}/ssl_support.rb +21 -1
  31. data/lib/{vertx → core}/streams.rb +32 -21
  32. data/lib/{vertx → core}/tcp_support.rb +22 -36
  33. data/lib/core/timers.rb +73 -0
  34. data/lib/core/vertx_require.rb +25 -0
  35. data/lib/{vertx → core}/wrapped_handler.rb +0 -0
  36. data/lib/jubilee.rb +5 -8
  37. data/lib/jubilee/cli.rb +1 -1
  38. data/lib/jubilee/jubilee.jar +0 -0
  39. data/lib/jubilee/jubilee_require.rb +24 -0
  40. data/lib/jubilee/version.rb +1 -1
  41. data/lib/test_utils.rb +66 -0
  42. data/lib/vertx.rb +13 -10
  43. data/lib/vertx_tests.rb +8 -0
  44. data/pom.xml +351 -0
  45. data/src/main/assembly/mod.xml +21 -0
  46. data/{java/src → src/main/java}/jubilee/JubileeService.java +0 -0
  47. data/{java/src → src/main/java}/org/jruby/jubilee/Const.java +0 -0
  48. data/{java/src → src/main/java}/org/jruby/jubilee/JubileeVerticle.java +12 -2
  49. data/src/main/java/org/jruby/jubilee/JubileeVerticleFactory.java +258 -0
  50. data/{java/src → src/main/java}/org/jruby/jubilee/RackApplication.java +3 -1
  51. data/{java/src → src/main/java}/org/jruby/jubilee/RackEnvironment.java +2 -2
  52. data/{java/src → src/main/java}/org/jruby/jubilee/RackEnvironmentHash.java +0 -0
  53. data/{java/src → src/main/java}/org/jruby/jubilee/RackInput.java +0 -0
  54. data/{java/src → src/main/java}/org/jruby/jubilee/RackResponse.java +0 -0
  55. data/{java/src → src/main/java}/org/jruby/jubilee/RubyCallable.java +0 -0
  56. data/{java/src → src/main/java}/org/jruby/jubilee/RubyHttpServerResponse.java +0 -0
  57. data/{java/src → src/main/java}/org/jruby/jubilee/RubyNetSocket.java +0 -0
  58. data/{java/src → src/main/java}/org/jruby/jubilee/RubyPlatformManager.java +0 -0
  59. data/{java/src → src/main/java}/org/jruby/jubilee/impl/RubyIORackInput.java +0 -0
  60. data/{java/src → src/main/java}/org/jruby/jubilee/impl/RubyNullIO.java +0 -0
  61. data/{java/src → src/main/java}/org/jruby/jubilee/utils/RubyHelper.java +0 -0
  62. data/{java/src → src/main/java}/org/jruby/jubilee/vertx/JubileeVertx.java +0 -0
  63. data/{java → src/main}/resources/META-INF/services/org.vertx.java.core.spi.cluster.ClusterManagerFactory +0 -0
  64. data/src/main/resources/META-INF/services/org.vertx.java.deploy.impl.jruby.JubileeVerticleFactory +1 -0
  65. data/{java → src/main}/resources/default-cluster.xml +0 -0
  66. data/src/main/resources/mod.json +11 -0
  67. data/test/jubilee/test_upload.rb +3 -1
  68. data/vertx_classpath.txt +12 -0
  69. metadata +69 -47
  70. data/Guardfile +0 -24
  71. data/jars/vertx-core-2.1.1.jar +0 -0
  72. data/java/src/org/jruby/jubilee/RubyChannel.java +0 -89
  73. data/lib/vertx/README.md +0 -7
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- require 'vertx/shared_data'
15
+ require 'core/shared_data'
16
16
 
17
17
  module Vertx
18
18
 
@@ -0,0 +1,280 @@
1
+ # Copyright 2013 the original author or authors.
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 'core/buffer'
16
+ require 'core/wrapped_handler'
17
+ require 'core/network_support'
18
+ require 'core/streams'
19
+ require 'socket'
20
+
21
+ module Vertx
22
+
23
+
24
+ #
25
+ # A Datagram socket which can be used to send data to remote Datagram servers and receive [DatagramPacket]s .
26
+ #
27
+ # Usually you use a Datragram Client to send UDP over the wire. UDP is connection-less which means you are not connected
28
+ # to the remote peer in a persistent way. Because of this you have to supply the address and port of the remote peer
29
+ # when sending data.
30
+ #
31
+ # You can send data to ipv4 or ipv6 addresses, which also include multicast addresses.
32
+ #
33
+ # @author Norman Maurer
34
+ class DatagramSocket
35
+ include ReadSupport, DrainSupport, NetworkSupport
36
+
37
+ def initialize(ipv4=nil)
38
+ if ipv4 == nil
39
+ family = nil
40
+ elsif ipv4
41
+ family = org.vertx.java.core.datagram.InternetProtocolFamily::IPv4
42
+ else
43
+ family = org.vertx.java.core.datagram.InternetProtocolFamily::IPv6
44
+ end
45
+ @j_del = org.vertx.java.platform.impl.JRubyVerticleFactory.vertx.createDatagramSocket(family)
46
+ @local_address = nil
47
+ end
48
+
49
+ # Write the given {@link org.vertx.java.core.buffer.Buffer} to the {@link java.net.InetSocketAddress}. The {@link org.vertx.java.core.Handler} will be notified once the
50
+ # write completes.
51
+ #
52
+ # @param [String] host the host address of the remote peer
53
+ # @param [FixNum] port the host port of the remote peer
54
+ # @param [Buffer] packet the buffer to write
55
+ # @param [Block] hndlr the handler to notify once the write completes.
56
+ # @return [DatagramSocket] self itself for method chaining
57
+ def send(host, port, packet, &hndlr)
58
+ @j_del.send(packet._to_java_buffer, host, port, ARWrappedHandler.new(hndlr) { |j_del| self })
59
+ self
60
+ end
61
+
62
+ #
63
+ # Write the given {@link String} to the {@link InetSocketAddress} using UTF8 encoding. The {@link Handler} will be notified once the
64
+ # write completes.
65
+ #
66
+ #
67
+ # @param [String] host the host address of the remote peer
68
+ # @param [FixNum] port the host port of the remote peer
69
+ # @param [String] str the data to send
70
+ # @param [String] enc the charset to use to encode the data
71
+ # @param [Block] hndlr the handler to notify once the write completes.
72
+ # @return [DatagramSocket] self itself for method chaining
73
+ def send_str(host, port, str, enc = 'UTF-8', &hndlr)
74
+ @j_del.send(str, enc, host, port, ARWrappedHandler.new(hndlr) { |j_del| self })
75
+ self
76
+ end
77
+
78
+ #
79
+ # set the {@link java.net.StandardSocketOptions#SO_BROADCAST} option.
80
+ #
81
+ def broadcast=(val)
82
+ @j_del.setBroadcast(val)
83
+ self
84
+ end
85
+
86
+ #
87
+ # set the {@link java.net.StandardSocketOptions#SO_BROADCAST} option.
88
+ #
89
+ def broadcast?
90
+ @j_del.isBroadcast
91
+ end
92
+
93
+ #
94
+ # Set the {@link java.net.StandardSocketOptions#IP_MULTICAST_LOOP} option.
95
+ #
96
+ def multicast_loopback_mode=(val)
97
+ @j_del.setMulticastLoopbackMode(val)
98
+ self
99
+ end
100
+
101
+ #
102
+ # Set the {@link java.net.StandardSocketOptions#IP_MULTICAST_LOOP} option.
103
+ #
104
+ def multicast_loopback_mode?
105
+ @j_del.isMulticastLoopbackMode
106
+ end
107
+
108
+ #
109
+ # Set the {@link java.net.StandardSocketOptions#IP_MULTICAST_TTL} option.
110
+ #
111
+ def multicast_time_to_live=(val)
112
+ @j_del.setMulticastTimeToLive(val)
113
+ self
114
+ end
115
+
116
+ #
117
+ # Gets the {@link java.net.StandardSocketOptions#IP_MULTICAST_TTL} option.
118
+ #
119
+ def multicast_time_to_live
120
+ @j_del.getMulticastTimeToLive
121
+ end
122
+
123
+ #
124
+ # Set the {@link java.net.StandardSocketOptions#IP_MULTICAST_IF} option.
125
+ #
126
+ def multicast_network_interface=(val)
127
+ @j_del.setMulticastNetworkInterface(val)
128
+ self
129
+ end
130
+
131
+ #
132
+ # Gets the {@link java.net.StandardSocketOptions#IP_MULTICAST_IF} option.
133
+ #
134
+ def multicast_network_interface
135
+ @j_del.getMulticastNetworkInterface
136
+ end
137
+
138
+
139
+ #
140
+ # Close the socket asynchronous and notifies the handler once done.
141
+ #
142
+ # @param [Block] hndlr the handler to notify once the opeation completes.
143
+ def close(&hndlr)
144
+ if hndlr
145
+ @j_del.close(ARWrappedHandler.new(hndlr))
146
+ else
147
+ @j_del.close
148
+ end
149
+ end
150
+
151
+ #
152
+ # Return the Addrinfo to which the local end of the socket is bound
153
+ #
154
+ # @return [Addrinfo] local_addr the local address to which the socket is bound if it is bound at all.
155
+ def local_address
156
+ if !@local_address
157
+ addr = j_del.localAddress
158
+ if addr != null
159
+ @local_address = Addrinfo.tcp(@local_address.getAddress().getHostAddress(), @@local_address.getPort())
160
+ end
161
+ end
162
+ @local_address
163
+ end
164
+
165
+ #
166
+ # Joins a multicast group and so start listen for packets send to it. The {@link Handler} is notified once the operation completes.
167
+ #
168
+ #
169
+ # @param [String] multicast_address the address of the multicast group to join
170
+ # @param [String] source the address of the source for which we will listen for mulicast packets
171
+ # @param [String] network_interface the network interface on which to listen for packets.
172
+ # @param [Block] hndlr the handler to notify once the opeation completes.
173
+ # @return [DatagramSocket] self itself for method chaining
174
+ def listen_multicast_group(multicast_address, source = nil, network_interface = nil, &hndlr)
175
+ if network_interface != nil && source != nil
176
+ @j_del.listenMulticastGroup(multicast_address, network_interface, source, ARWrappedHandler.new(hndlr) { |j_del| self })
177
+ else
178
+ @j_del.listenMulticastGroup(multicast_address, ARWrappedHandler.new(hndlr) { |j_del| self })
179
+ end
180
+ self
181
+ end
182
+
183
+ #
184
+ # Leaves a multicast group and so stop listen for packets send to it on the given network interface.
185
+ # The {@link Handler} is notified once the operation completes.
186
+ #
187
+ #
188
+ # @param [String] multicast_address the address of the multicast group to leave
189
+ # @param [String] source the address of the source for which we will listen for mulicast packets
190
+ # @param [String] network_interface the network interface on which to listen for packets.
191
+ # @param [Block] hndlr the handler to notify once the opeation completes.
192
+ # @return [DatagramSocket] self itself for method chaining
193
+ def unlisten_multicast_group(multicast_address, source = nil, network_interface = nil, &hndlr)
194
+ if network_interface != nil && source != nil
195
+ @j_del.unlistenMulticastGroup(multicast_address, network_interface, source, ARWrappedHandler.new(hndlr) { |j_del| self })
196
+ else
197
+ @j_del.unlistenMulticastGroup(multicast_address, ARWrappedHandler.new(hndlr) { |j_del| self })
198
+ end
199
+ self
200
+ end
201
+
202
+ #
203
+ # Block the given sourceToBlock address for the given multicastAddress on the given network interface and notifies
204
+ # the {@link Handler} once the operation completes.
205
+ #
206
+ #
207
+ # @param [String] multicast_address the address for which you want to block the sourceToBlock
208
+ # @param [String] source_to_block the source address which should be blocked. You will not receive an multicast packets
209
+ # for it anymore.
210
+ # @param [String] network_interface the network interface on which the blocking should accour.
211
+ # @param [Block] hndlr the handler to notify once the opeation completes.
212
+ # @return [DatagramSocket] self itself for method chaining
213
+ #
214
+ def block_multicast_group(multicast_address, source_to_block, network_interface = nil, &hndlr)
215
+ if network_interface != nil
216
+ @j_del.blockMulticastGroup(multicast_address, network_interface, source_to_block, ARWrappedHandler.new(hndlr) { |j_del| self })
217
+ else
218
+ @j_del.blockMulticastGroup(multicast_address, source_to_block, ARWrappedHandler.new(hndlr) { |j_del| self })
219
+ end
220
+ self
221
+ end
222
+
223
+ #
224
+ # Listen for incoming [DatagramPacket]s on the given address and port.
225
+ #
226
+ #
227
+ # @param [FixNum] port the port on which to listen for incoming [DatagramPacket]s
228
+ # @param [String] address the address on which to listen for incoming [DatagramPacket]s
229
+ # @param [Block] hndlr the handler to notify once the opeation completes.
230
+ # @return [DatagramSocket] self itself for method chaining
231
+ #
232
+ def listen(port, address = '0.0.0.0', &hndlr)
233
+ @j_del.listen(address, port, ARWrappedHandler.new(hndlr) { |j_del| self })
234
+ self
235
+ end
236
+
237
+
238
+ # Set a data handler. As data is read, the handler will be called with the data.
239
+ #
240
+ # @param [Block] hndlr. The data handler
241
+ def data_handler(&hndlr)
242
+ @j_del.dataHandler(Proc.new { |j_packet|
243
+ hndlr.call(DatagramPacket.new(j_packet))
244
+ })
245
+ self
246
+ end
247
+ end
248
+
249
+
250
+ # A received Datagram packet (UDP) which contains the data and information about the sender of the data itself.
251
+ #
252
+ # @author Norman Maurer
253
+ class DatagramPacket
254
+ def initialize(j_packet)
255
+ @j_packet = j_packet
256
+ @sender = nil
257
+ @data = nil
258
+ end
259
+
260
+ # Return the address of the sender of this [DatagramPacket].
261
+ #
262
+ # @return [AddrInfo] addr the address of the sender
263
+ def sender
264
+ if !@sender
265
+ @sender = Addrinfo.tcp(@j_packet.sender().getAddress().getHostAddress(), @j_packet.sender().getPort())
266
+ end
267
+ @sender
268
+ end
269
+
270
+ # Return the data which was received
271
+ #
272
+ # @return [Buffer] data the data which was received
273
+ def data
274
+ if !@data
275
+ @data = Buffer.new(@j_packet.data())
276
+ end
277
+ @data
278
+ end
279
+ end
280
+ end
@@ -0,0 +1,143 @@
1
+ # Copyright 2013 the original author or authors.
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 'core/wrapped_handler'
16
+ require 'socket'
17
+
18
+ module Vertx
19
+
20
+ MxRecord = Struct.new(:priority, :name)
21
+ SrvRecord = Struct.new(:priority, :weight, :port, :name, :protocol, :service, :target)
22
+
23
+ # An async DNS Client
24
+ #
25
+ # @author Norman Maurer
26
+ class DnsClient
27
+ def initialize(*servers)
28
+ @j_dns = org.vertx.java.platform.impl.JRubyVerticleFactory.vertx.createDnsClient(
29
+ servers.map { |value| java.net.InetSocketAddress.new(value.ip_address, value.ip_port) }.to_java(java.net.InetSocketAddress))
30
+ end
31
+
32
+ # Try to lookup the A (ipv4) or AAAA (ipv6) record for the given name. The first found will be used.
33
+ # The handler will be notified once the lookup completes.
34
+ # @param [Block] hndlr A block to be used as the handler
35
+ def lookup(name, &hndlr)
36
+ @j_dns.lookup(name, ARWrappedHandler.new(hndlr) { |addr| addr.getHostAddress()})
37
+ self
38
+ end
39
+
40
+ # Try to lookup the A (ipv4) record for the given name. The first found will be used.
41
+ # The handler will be notified once the lookup completes.
42
+ # @param [Block] hndlr A block to be used as the handler
43
+ def lookup_4(name, &hndlr)
44
+ @j_dns.lookup4(name, ARWrappedHandler.new(hndlr) { |addr| addr.getHostAddress()})
45
+ self
46
+ end
47
+
48
+ # Try to AAAA (ipv6) record for the given name. The first found will be used.
49
+ # The handler will be notified once the lookup completes.
50
+ # @param [Block] hndlr A block to be used as the handler
51
+ def lookup_6(name, &hndlr)
52
+ @j_dns.lookup6(name, ARWrappedHandler.new(hndlr) { |addr| addr.getHostAddress()})
53
+ self
54
+ end
55
+
56
+ # Try to resolve all A records for the given name.
57
+ # The handler will be notified once the operation completes.
58
+ # @param [Block] hndlr A block to be used as the handler
59
+ def resolve_a(name, &hndlr)
60
+ @j_dns.resolveA(name, ARWrappedHandler.new(hndlr) { |j_list|
61
+ j_list.map { |item|
62
+ item.getHostAddress()
63
+ }
64
+ })
65
+ self
66
+ end
67
+
68
+ # Try to resolve all AAAA records for the given name.
69
+ # The handler will be notified once the operation completes.
70
+ # @param [Block] hndlr A block to be used as the handler
71
+ def resolve_aaaa(name, &hndlr)
72
+ @j_dns.resolveAAAA(name, ARWrappedHandler.new(hndlr) { |j_list|
73
+ j_list.map { |item|
74
+ item.getHostAddress()
75
+ }
76
+ })
77
+ self
78
+ end
79
+
80
+ # Try to resolve all CNAME records for the given name.
81
+ # The handler will be notified once the operation completes.
82
+ # @param [Block] hndlr A block to be used as the handler
83
+ def resolve_cname(name, &hndlr)
84
+ @j_dns.resolveCNAME(name, ARWrappedHandler.new(hndlr))
85
+ self
86
+ end
87
+
88
+ # Try to resolve all MX records for the given name.
89
+ # The handler will be notified once the operation completes.
90
+ # @param [Block] hndlr A block to be used as the handler
91
+ def resolve_mx(name, &hndlr)
92
+ @j_dns.resolveMX(name, ARWrappedHandler.new(hndlr) { |j_list|
93
+ j_list.map { |item|
94
+ MxRecord.new(item.priority(), item.name())
95
+ }
96
+ })
97
+ self
98
+ end
99
+
100
+ # Try to resolve the PTR record for the given name.
101
+ # The handler will be notified once the operation completes.
102
+ # @param [Block] hndlr A block to be used as the handler
103
+ def resolve_ptr(name, &hndlr)
104
+ @j_dns.resolvePTR(name, ARWrappedHandler.new(hndlr))
105
+ self
106
+ end
107
+
108
+ # Try to resolve all NS records for the given name.
109
+ # The handler will be notified once the operation completes.
110
+ # @param [Block] hndlr A block to be used as the handler
111
+ def resolve_ns(name, &hndlr)
112
+ @j_dns.resolveNS(name, ARWrappedHandler.new(hndlr))
113
+ self
114
+ end
115
+
116
+ def resolve_txt(name, &hndlr)
117
+ @j_dns.resolveTXT(name, ARWrappedHandler.new(hndlr))
118
+ self
119
+ end
120
+
121
+ # Try to resolve all SRV records for the given name.
122
+ # The handler will be notified once the operation completes.
123
+ # @param [Block] hndlr A block to be used as the handler
124
+ def resolve_srv(name, &hndlr)
125
+ @j_dns.resolveSRV(name, ARWrappedHandler.new(hndlr) { |j_list|
126
+ j_list.map { |item|
127
+ SrvRecord.new(item.priority(), item.weight(), item.port(), item.name(), item.protocol(), item.service(), item.target())
128
+ }
129
+ })
130
+ self
131
+ end
132
+
133
+ # Try to do a reverse lookup of an ipaddress. This is basically the same as doing trying to resolve a PTR record
134
+ # but allows you to just pass in the ipaddress and not a valid ptr query string.
135
+ # The handler will be notified once the operation completes.
136
+ # @param [Block] hndlr A block to be used as the handler
137
+ def reverse_lookup(name, &hndlr)
138
+ @j_dns.reverseLookup(name, ARWrappedHandler.new(hndlr) { |addr| addr.getHostName()})
139
+ self
140
+ end
141
+
142
+ end
143
+ end
@@ -53,17 +53,39 @@ module Vertx
53
53
 
54
54
  @@handler_map = {}
55
55
 
56
- @@j_eventbus = org.jruby.jubilee.vertx.JubileeVertx.vertx().eventBus()
56
+ @@j_eventbus = org.vertx.java.platform.impl.JRubyVerticleFactory.vertx.eventBus()
57
57
 
58
58
  # Send a message on the event bus
59
59
  # @param message [Hash] The message to send
60
60
  # @param reply_handler [Block] An optional reply handler.
61
+ # @param [Integer] timeout if specified sends the message
61
62
  # It will be called when the reply from a receiver is received.
62
- def EventBus.send(address, message, &reply_handler)
63
- EventBus.send_or_pub(true, address, message, reply_handler)
63
+ def EventBus.send(address, message, timeout = nil, &reply_handler)
64
+
65
+ if timeout.nil?
66
+ EventBus.send_or_pub(true, address, message, reply_handler)
67
+ else
68
+ EventBus.send_or_pub(true, address, message, reply_handler, timeout)
69
+ end
70
+
64
71
  self
65
72
  end
66
73
 
74
+ # Sets a default timeout, in ms, for replies. If a messages is sent specify a reply handler
75
+ # but without specifying a timeout, then the reply handler is timed out, i.e. it is automatically unregistered
76
+ # if a message hasn't been received before timeout.
77
+ # The default value for default send timeout is -1, which means "never timeout".
78
+ # @param timeout
79
+ def EventBus.default_reply_timeout=(timeout)
80
+ @@j_eventbus.setDefaultReplyTimeout(timeout)
81
+ self
82
+ end
83
+
84
+ # Gets the default reply timeout value
85
+ def EventBus.default_reply_timeout
86
+ @@j_eventbus.getDefaultReplyTimeout
87
+ end
88
+
67
89
  # Publish a message on the event bus
68
90
  # @param message [Hash] The message to publish
69
91
  def EventBus.publish(address, message)
@@ -72,13 +94,17 @@ module Vertx
72
94
  end
73
95
 
74
96
  # @private
75
- def EventBus.send_or_pub(send, address, message, reply_handler = nil)
97
+ def EventBus.send_or_pub(send, address, message, reply_handler = nil, timeout = nil)
76
98
  raise "An address must be specified" if !address
77
99
  raise "A message must be specified" if message == nil
78
100
  message = convert_msg(message)
79
101
  if send
80
102
  if reply_handler != nil
81
- @@j_eventbus.send(address, message, InternalHandler.new(reply_handler))
103
+ if timeout != nil
104
+ @@j_eventbus.send_with_timeout address, message, timeout, AsyncInternalHandler.new(reply_handler)
105
+ else
106
+ @@j_eventbus.send(address, message, InternalHandler.new(reply_handler))
107
+ end
82
108
  else
83
109
  @@j_eventbus.send(address, message)
84
110
  end
@@ -165,6 +191,7 @@ module Vertx
165
191
  end
166
192
  end
167
193
 
194
+
168
195
  # Represents a message received from the event bus
169
196
  # @author {http://tfox.org Tim Fox}
170
197
  class Message
@@ -190,17 +217,61 @@ module Vertx
190
217
  # Replying to a message this way is equivalent to sending a message to an address which is the same as the message id
191
218
  # of the original message.
192
219
  # @param [Hash] Message send as reply
193
- def reply(reply, &reply_handler)
220
+ def reply(reply, timeout = nil, &reply_handler)
194
221
  raise "A reply message must be specified" if reply == nil
195
222
  reply = EventBus.convert_msg(reply)
196
223
  if reply_handler != nil
197
- @j_del.reply(reply, InternalHandler.new(reply_handler))
224
+ if timeout != nil
225
+ @j_del.reply_with_timeout reply, timeout, AsyncInternalHandler.new(reply_handler)
226
+ else
227
+ @j_del.reply(reply, InternalHandler.new(reply_handler))
228
+ end
198
229
  else
199
230
  @j_del.reply(reply)
200
231
  end
201
232
  end
202
233
 
234
+ # Gets the address the message was sent to
235
+ # @return [String] The recipient's address
236
+ def address
237
+ @j_del.address
238
+ end
239
+
240
+ def fail(failure_code, message)
241
+ @j_del.fail failure_code, message
242
+ end
243
+
203
244
  end
204
245
 
205
- end
206
246
 
247
+ # Error when the event bus use timeout and doesn't reply in time
248
+ # Copied from mod-lang-jython
249
+ class ReplyError
250
+
251
+ TIMEOUT = 0
252
+ NO_HANDLERS = 1
253
+ RECIPIENT_FAILURE = 2
254
+
255
+ def initialize(exception)
256
+ @exception = exception
257
+ end
258
+ def type
259
+ @exception.failureType().toInt()
260
+ end
261
+ end
262
+
263
+ # Copied from mod-lang-jython
264
+ class AsyncInternalHandler
265
+ include org.vertx.java.core.AsyncResultHandler
266
+ def initialize(hndlr)
267
+ @hndlr = hndlr
268
+ end
269
+ def handle(result)
270
+ if result.failed?
271
+ @hndlr.call(ReplyError.new(result.cause))
272
+ else
273
+ @hndlr.call(Message.new(result.result))
274
+ end
275
+ end
276
+ end
277
+ end