I have some architecture question. I develop a wicket web-app running on glassfish appserver, there is some ejb module, etc. To create chat panel I would like to use some kind of JMS, for example Apache ActiveMQ to avoid continuous polling.
I made 2 kind of handlers Sender
and Receiver
. Both of them has ConnectionFactory, Connecton, Session.
Chat panels represents chat rooms, and each chat rooms is a Topic. (when you open a chat panel with choosen 'room', you logically subscribe the given topic.) Panels are implements MessageListener interface, so panels are listeners of consumer in Receiver object.
So panels sends messages to their topics within their Sender object, and listens them through their Receiver object. (Yeah, every panel has a Sender
and a Receiver
object too)
In this way there is 2 connections/panel and nobody care about close those connections at all. :(
I don't think it's a good way to use activemq. I need some advice to implement this function. Could you please give me some instruction, how experts do this? Or maybe which direction I have to go?
(ps, AMQ has running totally standalone)
Sender,
public class Sender {
private String user = ActiveMQConnection.DEFAULT_USER;
private String password = ActiveMQConnection.DEFAULT_PASSWORD;
private String url = "failover://(tcp://0.0.0.0:61616)?randomize=false";
private Destination destination;
private Connection connection = null;
private Session session = null;
private ActiveMQConnectionFactory connectionFactory;
private MessageProducer producer;
public Sender(String topicId) {
try {
connectionFactory = new ActiveMQConnectionFactory(user, password, url);
connectionFactory.setDispatchAsync(false);
connection = connectionFactory.createTopicConnection(user, password);
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic(topicId);
producer = session.createProducer(destination);
} catch (JMSException ex) {
Logger.getLogger(Sender.class.getName()).log(Level.SEVERE, null, ex);
System.out.println(ex.toString());
}
}
public void sendMessage(String message) {
try {
BytesMessage message = session.createBytesMessage();
message.setLongProperty("text", message);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
producer.send(destination, message);
} catch (JMSException ex) {
Logger.getLogger(Sender.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void close() {
try {
producer.close();
session.close();
connection.close();
} catch (JMSException ex) {
Logger.getLogger(Sender.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Receiver,
public class Receiver {
private String url = "failover://(tcp://0.0.0.0:61616)?randomize=false";
private ActiveMQConnectionFactory connectionFactory;
private Connection connection;
private Session session = null;
private Topic destination = null;
private TopicSubscriber consumer;
private IdGenerator clientIdGenerator = new IdGenerator();
public Receiver(String topicId, MessageListener listener) {
try {
connectionFactory = new ActiveMQConnectionFactory(url);
connectionFactory.setDispatchAsync(false);
connection = connectionFactory.createTopicConnection();
connection.setClientID(clientIdGenerator.generateId());
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic(topicId);
consumer = session.createDurableSubscriber(destination, "subscriber");
consumer.setMessageListener(listener);
} catch (JMSException ex) {
Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void close() {
try {
consumer.close();
session.close();
connection.close();
} catch (JMSException ex) {
onException(ex);
Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
}
}
}