package org.jboss.seam.remoting.messaging;
import java.util.ArrayList;
import java.util.List;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
/**
*
* @author Shane Bryzak
*/
public class RemoteSubscriber
{
private String token;
private String topicName;
private Topic topic;
private TopicSession topicSession;
private TopicSubscriber subscriber;
public RemoteSubscriber(String token, String topicName)
{
this.token = token;
this.topicName = topicName;
}
public String getToken()
{
return token;
}
public String getTopicName()
{
return topicName;
}
public void subscribe(TopicConnection conn)
throws JMSException
{
topicSession = conn.createTopicSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
topic = topicSession.createTopic(topicName);
subscriber = topicSession.createSubscriber(topic);
}
public void unsubscribe()
{
try {
subscriber.close();
// Remove the subscription's token from the user's session context
SubscriptionRegistry.instance().getUserTokens().remove(token);
}
catch (JMSException ex) { }
try {
topicSession.close();
}
catch (JMSException ex) { }
}
public void setTopicSubscriber(TopicSubscriber subscriber)
{
this.subscriber = subscriber;
}
public TopicSubscriber getTopicSubscriber()
{
return subscriber;
}
public List<Message> poll(int timeout)
throws JMSException
{
List<Message> messages = null;
Message m = null;
synchronized(subscriber)
{
do {
// Only timeout for the first message.. subsequent messages should be nowait
if (messages == null && timeout > 0)
m = subscriber.receive(timeout * 1000);
else
m = subscriber.receiveNoWait();
if (m != null) {
if (messages == null)
messages = new ArrayList<Message> ();
messages.add(m);
}
}
while (m != null);
}
return messages;
}
}