001    /*
002     * Copyright 1999-2004 The Apache Software Foundation.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     * 
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.apache.commons.messenger;
017    
018    import java.io.Serializable;
019    
020    import javax.jms.BytesMessage;
021    import javax.jms.Connection;
022    import javax.jms.ConnectionConsumer;
023    import javax.jms.Destination;
024    import javax.jms.JMSException;
025    import javax.jms.MapMessage;
026    import javax.jms.Message;
027    import javax.jms.MessageConsumer;
028    import javax.jms.MessageListener;
029    import javax.jms.ObjectMessage;
030    import javax.jms.QueueBrowser;
031    import javax.jms.ServerSessionPool;
032    import javax.jms.Session;
033    import javax.jms.StreamMessage;
034    import javax.jms.TextMessage;
035    
036    /** <p><code>Messenger</code> a facade over the JMS API making it easy to use JMS
037      * and hiding much of the complexity of threading and configuration.
038      * A Messenger will internally associate a JMS Session with the calling thread
039      * so that all methods called in the same thread (such as inside a Servlet or 
040      * taglib) will use the same JMS Session.</p>
041      *
042      * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
043      * @version $Revision: 155459 $
044      */
045    public interface Messenger {
046    
047        /** Temporary hack - this method has been added so that Messenger works better with the digester */
048        public String getName();
049    
050        /** Returns the destination for the given subject name */
051        public Destination getDestination(String subject) throws JMSException;
052    
053        /** Returns a new temporary destination */
054        public Destination createTemporaryDestination() throws JMSException;
055    
056        /** Sends a message on the given destination */
057        public void send(Destination destination, Message message) throws JMSException;
058    
059        /** Sends a message on the given destination and blocks until a response is returned */
060        public Message call(Destination destination, Message message)
061            throws JMSException;
062    
063        /** Sends a message on the given destination and blocks until a response is returned or the given timeout period expires */
064        public Message call(
065            Destination destination,
066            Message message,
067            long timeoutMillis)
068            throws JMSException;
069    
070        /** Receives a message on the given destination, blocking until one is returned */
071        public Message receive(Destination destination) throws JMSException;
072    
073        /** Receives a message on the given destination and message selector, blocking until one is returned */
074        public Message receive(Destination destination, String selector)
075            throws JMSException;
076    
077        /** Receives a message on the given destination, blocking for the specified timeout */
078        public Message receive(Destination destination, long timeoutMillis)
079            throws JMSException;
080    
081        /** Receives a message on the given destination and selector, blocking for the specified timeout */
082        public Message receive(
083            Destination destination,
084            String selector,
085            long timeoutMillis)
086            throws JMSException;
087    
088        /** Receives a message on the given destination without blocking or returns null */
089        public Message receiveNoWait(Destination destination) throws JMSException;
090    
091        /** Receives a message on the given destination and selector without blocking or returns null */
092        public Message receiveNoWait(Destination destination, String selector)
093            throws JMSException;
094    
095        /** Creates a MessageConsumer for the given JMS Desintation
096         */
097        public MessageConsumer createConsumer(Destination destination)
098            throws JMSException;
099    
100        /** Creates a MessageConsumer for the given JMS Desintation and JMS selector
101         */
102        public MessageConsumer createConsumer(Destination destination, String selector)
103            throws JMSException;
104    
105    
106        /**
107         * Creates a QueueBrowser for the given Queue
108         */    
109        public QueueBrowser createBrowser(Destination destination) throws JMSException;
110            
111    
112        /** Allows this current thread to be given to the JMS connection to process messages. This
113         * method can be useful for creating background processing threads
114         */
115        public void run();
116    
117        /** Returns the underlying JMS connection that this Messenger is using */
118        public Connection getConnection() throws JMSException;
119    
120        /** 
121         * Returns the underlying JMS session that this thread is using for
122         * synchronous operations such as send() and receive() for synchronous operation
123         */ 
124        public Session getSession() throws JMSException;
125    
126        /** 
127         * Returns the underlying JMS session that this thread is using for
128         * this Messenger for asynchronous operation such as addMessageListener() operations
129         */ 
130        public Session getAsyncSession() throws JMSException;
131    
132    
133        /** Creates a ConnectionConsumer which is useful if used inside an application server
134         * to associate multiple threads with consuming from a JMS destination */
135        public ConnectionConsumer createConnectionConsumer(
136            Destination destination,
137            ServerSessionPool sessionPool,
138            int maxMessages)
139            throws JMSException;
140    
141        /** Creates a ConnectionConsumer which is useful if used inside an application server
142         * to associate multiple threads with consuming from a JMS destination */
143        public ConnectionConsumer createConnectionConsumer(
144            Destination destination,
145            String selector,
146            ServerSessionPool sessionPool,
147            int maxMessages)
148            throws JMSException;
149    
150        /** Creates a new ServerSessionPool implementation with a given maximum number of threads
151         * for use by a ConnectionConsumer
152         */
153        public ServerSessionPool createServerSessionPool(
154            MessageListener messageListener,
155            int maxThreads)
156            throws JMSException;
157    
158        // Listener API
159        //-------------------------------------------------------------------------    
160    
161        /** Adds a message listener on the given destination */
162        public void addListener(Destination destination, MessageListener listener)
163            throws JMSException;
164    
165        public void addListener(
166            Destination destination,
167            String selector,
168            MessageListener listener)
169            throws JMSException;
170    
171        public void removeListener(Destination destination, MessageListener listener)
172            throws JMSException;
173    
174        public void removeListener(
175            Destination destination,
176            String selector,
177            MessageListener listener)
178            throws JMSException;
179    
180    
181        // Message factory methods
182        //-------------------------------------------------------------------------    
183    
184        public BytesMessage createBytesMessage() throws JMSException;
185    
186        public MapMessage createMapMessage() throws JMSException;
187    
188        public Message createMessage() throws JMSException;
189    
190        public ObjectMessage createObjectMessage() throws JMSException;
191    
192        public ObjectMessage createObjectMessage(Serializable object)
193            throws JMSException;
194    
195        public StreamMessage createStreamMessage() throws JMSException;
196    
197        public TextMessage createTextMessage() throws JMSException;
198    
199        public TextMessage createTextMessage(String text) throws JMSException;
200    
201    
202        // Transaction related methods
203        //-------------------------------------------------------------------------    
204        /** Commits all messages done in this thread and releases any locks */
205        public void commit() throws JMSException;
206    
207        /** Rolls back any messages done in this thread and releases any locks */
208        public void rollback() throws JMSException;
209    
210        /** Closes the underlying JMS connection */
211        public void close() throws JMSException;
212    
213    
214        // Extra configuration methods available in JMS
215        //-------------------------------------------------------------------------        
216        
217        /** 
218         * Returns the SessionFactory used to create new JMS sessions 
219         * and Connections. This allows things like transaction mode to be
220         * configured before sessions are created. 
221         */
222        public SessionFactory getSessionFactory() throws JMSException;
223        
224        
225        public int getDeliveryMode(Destination destination) throws JMSException;
226    
227        public boolean getDisableMessageID(Destination destination)
228            throws JMSException;
229    
230        public boolean getDisableMessageTimestamp(Destination destination)
231            throws JMSException;
232    
233        public int getPriority(Destination destination) throws JMSException;
234    
235        public long getTimeToLive(Destination destination) throws JMSException;
236    
237        public void setDeliveryMode(Destination destination, int deliveryMode)
238            throws JMSException;
239    
240        public void setDisableMessageID(Destination destination, boolean value)
241            throws JMSException;
242    
243        public void setDisableMessageTimestamp(Destination destination, boolean value)
244            throws JMSException;
245    
246        public void setPriority(Destination destination, int defaultPriority)
247            throws JMSException;
248    
249        public void setTimeToLive(Destination destination, long timeToLive)
250            throws JMSException;
251    }