1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
#ifndef QPID_CLIENT_SESSIONBASE_H
#define QPID_CLIENT_SESSIONBASE_H
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
#include "qpid/framing/Uuid.h"
#include "qpid/framing/amqp_structs.h"
#include "qpid/framing/ProtocolVersion.h"
#include "qpid/framing/MethodContent.h"
#include "qpid/framing/TransferContent.h"
#include "qpid/client/Completion.h"
#include "qpid/client/ConnectionImpl.h"
#include "qpid/client/Execution.h"
#include "qpid/client/SessionImpl.h"
#include "qpid/client/TypedResult.h"
#include "qpid/shared_ptr.h"
#include <string>
namespace qpid {
namespace client {
using std::string;
using framing::Content;
using framing::FieldTable;
using framing::MethodContent;
using framing::SequenceNumberSet;
using framing::Uuid;
enum CreditUnit { MESSAGE=0, BYTE=1 };
/** \defgroup clientapi Synchronous mode of a session.
*
* SYNC means that Session functions do not return until the remote
* broker has confirmed that the command was executed.
*
* ASYNC means that the client sends commands asynchronously, Session
* functions return immediately.
*
* ASYNC mode gives better performance for high-volume traffic, but
* requires some additional caution.
*
* Session functions return immediately. If the command causes an
* exception on the broker, the exception will be thrown on a
* <em>later</em> function call.
*
* If you need to notify some extenal agent that some actions have
* been taken (e.g. binding queues to exchanges), you must call
* Session::sync() first to ensure that all the commands are complete.
*
* You can freely switch between modes by calling Session::setSynchronous().
*
* @see Session::sync(), Session::setSynchronous()
*/
enum SynchronousMode { SYNC=true, ASYNC=false };
/**
* Basic session operations that are not derived from AMQP XML methods.
*/
class SessionBase
{
public:
/**
* Instances of this class turn synchronous mode on for the
* duration of their scope (and revert back to async if required
* afterwards).
*/
class ScopedSync
{
SessionBase& session;
const bool change;
public:
ScopedSync(SessionBase& s);
~ScopedSync();
};
SessionBase();
~SessionBase();
/** Get the next message frame-set from the session. */
framing::FrameSet::shared_ptr get();
/** Get the session ID */
Uuid getId() const;
/**
* In synchronous mode, wait for the broker's response before
* returning. This gives lower throughput than asynchronous
* mode.
*
* In asynchronous mode commands are sent without waiting
* for a response (you can use the returned Completion object
* to wait for completion).
*
* @see SynchronousMode
*/
void setSynchronous(SynchronousMode mode);
void setSynchronous(bool set);
bool isSynchronous() const;
SynchronousMode getSynchronous() const;
/**
* Suspend the session, which can be resumed on a different connection.
* @see Connection::resume()
*/
void suspend();
/** Close the session */
void close();
Execution& getExecution();
void sync();
void flush();
void markCompleted(const framing::SequenceNumber& id, bool cumulative, bool notifyPeer);
void sendCompletion();
typedef framing::TransferContent DefaultContent;
protected:
shared_ptr<SessionImpl> impl;
framing::ProtocolVersion version;
friend class Connection;
SessionBase(shared_ptr<SessionImpl>);
};
}} // namespace qpid::client
#endif /*!QPID_CLIENT_SESSIONBASE_H*/
|