1
1
package io .vertx .rxcore .java .eventbus ;
2
2
3
3
import io .vertx .rxcore .java .impl .HandlerSubscription ;
4
+ import io .vertx .rxcore .java .impl .MemoizeHandler ;
4
5
import io .vertx .rxcore .java .impl .SingleSubscriptionHandler ;
5
6
import org .vertx .java .core .AsyncResult ;
6
7
import org .vertx .java .core .Handler ;
@@ -34,17 +35,17 @@ public class RxEventBus {
34
35
// Customer handlers
35
36
36
37
/** Standard SendHandler */
37
- protected static class SendHandler <R > extends SingleSubscriptionHandler <RxMessage <R >,Message <R >> {
38
+ protected class SendHandler <R > extends MemoizeHandler <RxMessage <R >,Message <R >> {
38
39
@ Override public void handle (Message m ) {
39
- fireResult (new RxMessage (m ));
40
+ complete (new RxMessageImpl (m ));
40
41
}
41
42
}
42
43
43
44
/** Async SendHandler */
44
- protected static class AsyncSendHandler <R > extends SingleSubscriptionHandler <RxMessage <R >, AsyncResult <Message <R >>> {
45
+ protected class AsyncSendHandler <R > extends SingleSubscriptionHandler <RxMessage <R >, AsyncResult <Message <R >>> {
45
46
@ Override public void handle (AsyncResult <Message <R >> r ) {
46
47
if (r .succeeded ()) {
47
- fireResult (new RxMessage (r .result ()));
48
+ fireResult (new RxMessageImpl (r .result ()));
48
49
}
49
50
else {
50
51
fireError (r .cause ());
@@ -53,7 +54,7 @@ protected static class AsyncSendHandler<R> extends SingleSubscriptionHandler<RxM
53
54
}
54
55
55
56
/** Async HandlerSubscription */
56
- protected static class AsyncSendSubscription <R > extends HandlerSubscription <AsyncResult <Message <R >>,RxMessage <R >> {
57
+ protected class AsyncSendSubscription <R > extends HandlerSubscription <AsyncResult <Message <R >>,RxMessage <R >> {
57
58
58
59
/** Create new AsyncSendSubscription */
59
60
public AsyncSendSubscription (Subscriber <RxMessage <R >> s ) {
@@ -63,7 +64,7 @@ public AsyncSendSubscription(Subscriber<RxMessage<R>> s) {
63
64
/** Handle event */
64
65
public void handle (AsyncResult <Message <R >> evt ) {
65
66
if (evt .succeeded ()) {
66
- fireComplete (new RxMessage (evt .result ()));
67
+ fireComplete (new RxMessageImpl (evt .result ()));
67
68
}
68
69
else {
69
70
fireError (evt .cause ());
@@ -72,19 +73,48 @@ public void handle(AsyncResult<Message<R>> evt) {
72
73
}
73
74
74
75
/** Receive handler */
75
- protected static class ReceiveHandler <R > extends SingleSubscriptionHandler <RxMessage <R >,Message > {
76
+ protected class ReceiveHandler <R > extends SingleSubscriptionHandler <RxMessage <R >,Message > {
76
77
@ Override public void handle (Message m ) {
77
- fireNext (new RxMessage (m ));
78
+ fireNext (new RxMessageImpl (m ));
78
79
}
79
80
}
80
-
81
+
82
+ /** RxMessage implementation with inherited timeouts */
83
+ protected class RxMessageImpl <R > extends RxMessage <R >
84
+ {
85
+ /** Create new RxMessageImpl */
86
+ public RxMessageImpl (Message <R > coreMessage ) {
87
+ super (coreMessage );
88
+ }
89
+
90
+ /** Observe a reply */
91
+ public <R ,T > Observable <RxMessage <T >> observeReply (final R msg )
92
+ {
93
+ return Observable .create (new AsyncSendHandler <T >() {
94
+ @ Override public void execute () {
95
+ coreMessage .replyWithTimeout (msg ,defaultTimeout ,this );
96
+ }
97
+ });
98
+ }
99
+
100
+ /** Observe a reply with timeout */
101
+ public <R ,T > Observable <RxMessage <T >> observeReplyWithTimeout (final R msg , final long timeout ) {
102
+ return Observable .create (new AsyncSendHandler <T >() {
103
+ @ Override public void execute () {
104
+ coreMessage .replyWithTimeout (msg ,timeout ,this );
105
+ }
106
+ });
107
+ }
108
+
109
+ }
110
+
81
111
// Instance variables
82
112
83
113
/** Core bus */
84
114
private final EventBus eventBus ;
85
115
86
116
/** Default timeout */
87
- private final int defaultTimeout ;
117
+ protected final int defaultTimeout ;
88
118
89
119
// Public
90
120
@@ -103,7 +133,7 @@ public RxEventBus(EventBus eventBus, int defaultTimeout) {
103
133
public <S ,R > Observable <RxMessage <R >> send (final String address , final S msg ) {
104
134
SendHandler <R > h =new SendHandler <R >();
105
135
this .eventBus .send (address ,msg ,(Handler )h );
106
- return Observable .create (h );
136
+ return Observable .create (h . subscribe );
107
137
}
108
138
109
139
/** Send a message with timeout */
@@ -131,7 +161,7 @@ public <S,R> Observable<RxMessage<R>> observeSendWithTimeout(final String addres
131
161
/** Send message for each subscription */
132
162
public void call (Subscriber <? super RxMessage <R >> subscriber ) {
133
163
AsyncSendSubscription hs =new AsyncSendSubscription (subscriber );
134
- eventBus .sendWithTimeout (address , (Object )msg , timeout , ( Handler ) hs );
164
+ eventBus .sendWithTimeout (address , (Object )msg , timeout , hs );
135
165
subscriber .add (hs );
136
166
}
137
167
});
0 commit comments