View | Details | Raw Unified | Return to bug 50667
Collapse All | Expand All

(-)java/org/apache/catalina/tribes/group/ExtendedRpcCallback.java (+53 lines)
Line 0 Link Here
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
package org.apache.catalina.tribes.group;
18
19
import java.io.Serializable;
20
21
import org.apache.catalina.tribes.ErrorHandler;
22
import org.apache.catalina.tribes.Member;
23
24
public interface ExtendedRpcCallback extends RpcCallback {
25
    
26
    /**
27
     * Invoked prior to a reply is sent when, and only when, the reply options contain the asynchronous sending options.
28
     * This is invoked prior to the reply being sent. A success/failure report will be reported on the error handler.
29
     * @param request - the original message that requested the reply
30
     * @param response - the reply message to the original message
31
     * @param sender - the sender requested that reply
32
     * @return the ErrorHandler object to handle the callback.
33
     */
34
    public ErrorHandler asyncReply(Serializable request, Serializable response, Member sender);
35
    
36
    /**
37
     * 
38
     * @param request - the original message that requested the reply
39
     * @param response - the reply message to the original message
40
     * @param sender - the sender requested that reply
41
     * @param reason - the reason the reply failed
42
     * @return true if the callback would like to reattempt the reply, false otherwise
43
     */
44
    public boolean replyFailed(Serializable request, Serializable response, Member sender, Exception reason);
45
    
46
    /**
47
     * 
48
     * @param request - the original message that requested the reply
49
     * @param response - the reply message to the original message
50
     * @param sender - the sender requested that reply
51
     */
52
    public void replySucceeded(Serializable request, Serializable response, Member sender);
53
}
0
  + native
54
  + native
(-)java/org/apache/catalina/tribes/group/RpcChannel.java (-7 / +26 lines)
Lines 24-29 Link Here
24
import org.apache.catalina.tribes.Channel;
24
import org.apache.catalina.tribes.Channel;
25
import org.apache.catalina.tribes.ChannelException;
25
import org.apache.catalina.tribes.ChannelException;
26
import org.apache.catalina.tribes.ChannelListener;
26
import org.apache.catalina.tribes.ChannelListener;
27
import org.apache.catalina.tribes.ErrorHandler;
27
import org.apache.catalina.tribes.Member;
28
import org.apache.catalina.tribes.Member;
28
import org.apache.catalina.tribes.util.UUIDGenerator;
29
import org.apache.catalina.tribes.util.UUIDGenerator;
29
import org.apache.juli.logging.Log;
30
import org.apache.juli.logging.Log;
Lines 126-139 Link Here
126
                }//synchronized
127
                }//synchronized
127
            }//end if
128
            }//end if
128
        } else{
129
        } else{
130
            boolean finished = false;
131
            ExtendedRpcCallback excallback = (callback instanceof ExtendedRpcCallback)?((ExtendedRpcCallback)callback) : null;
132
            boolean asyncReply = ((replyMessageOptions & Channel.SEND_OPTIONS_ASYNCHRONOUS) == Channel.SEND_OPTIONS_ASYNCHRONOUS);
129
            Serializable reply = callback.replyRequest(rmsg.message,sender);
133
            Serializable reply = callback.replyRequest(rmsg.message,sender);
130
            rmsg.reply = true;
134
            while (!finished) {
131
            rmsg.message = reply;
135
                ErrorHandler handler = excallback!=null && asyncReply ? excallback.asyncReply(rmsg.message, reply, sender) : null;
132
            try {
136
                rmsg.reply = true;
133
                channel.send(new Member[] {sender}, rmsg,
137
                rmsg.message = reply;
134
                        replyMessageOptions & ~Channel.SEND_OPTIONS_SYNCHRONIZED_ACK);
138
                try {
135
            }catch ( Exception x )  {
139
                    if (handler!=null) {
136
                log.error("Unable to send back reply in RpcChannel.",x);
140
                        channel.send(new Member[] {sender}, rmsg,replyMessageOptions & ~Channel.SEND_OPTIONS_SYNCHRONIZED_ACK, handler);
141
                    } else {
142
                        channel.send(new Member[] {sender}, rmsg,replyMessageOptions & ~Channel.SEND_OPTIONS_SYNCHRONIZED_ACK);
143
                    }
144
                    finished = true;
145
                    if (excallback != null && !asyncReply) {
146
                        excallback.replySucceeded(rmsg.message, reply, sender);
147
                    }
148
                }catch ( Exception x )  {
149
                    if (excallback != null && !asyncReply) {
150
                        finished = !excallback.replyFailed(rmsg.message, reply, sender, x);
151
                    } else {
152
                        finished = true;
153
                        log.error("Unable to send back reply in RpcChannel.",x);
154
                    }
155
                }
137
            }
156
            }
138
        }//end if
157
        }//end if
139
    }
158
    }

Return to bug 50667