最近在学习activeMQ,想模拟个类似于QQ单聊和群聊的功能..大致思路如下 消费者开发流程:
1.创建Connection:
2. 创建Session和queue :
3.根据queue 创建QueueReceiver 对象
queueConnection = connectionFactory.createQueueConnection();
queueConnection.start();
QueueSession queueSession = queueConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Queue queue = queueSession.createQueue(String.valueOf(fid)+"-"+String.valueOf(userId));
QueueReceiver queueReceiver = queueSession.createReceiver(queue);
queueReceiver.setMessageListener监听发布者发布的消息
单聊用的是point-to-point 点对点的形式发送方式
建立一个单聊消息类
public class SingleMessage implements Serializable {
private static final long serialVersionUID = -3264456779519472584L;
double id = 0.0;
int fromId = 0;
String fromName = "";
int toId = 0;
String toName = "";
String body = "";
Date sendDate = null;
public SingleMessage(){
id = Math.random();
}
public int getFromId() {
return fromId;
}
public void setFromId(int fromId) {
this.fromId = fromId;
}
public String getFromName() {
return fromName;
}
public void setFromName(String fromName) {
this.fromName = fromName;
}
public int getToId() {
return toId;
}
public void setToId(int toId) {
this.toId = toId;
}
public String getToName() {
return toName;
}
public void setToName(String toName) {
this.toName = toName;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public Date getSendDate() {
return sendDate;
}
public void setSendDate(Date sendDate) {
this.sendDate = sendDate;
}
public double getId() {
return id;
}
}
ActiveMQConnectionFactory connectionFactory = null;
Map<Integer, SingleChat> messageMap = new HashMap<Integer, SingleChat>();
发送消息的大致代码代码如下:
SingleMessage message = new SingleMessage();
message.setFromId(user.getId());
message.setFromName(user.getShowName());
message.setToId(fid);
message.setBody(text);
message.setSendDate(new Date());
try {
QueueConnection queueConnection = connectionFactory.createQueueConnection();
QueueSession session = queueConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue(String.valueOf(user.getId())+"-"+String.valueOf(fid));
QueueSender sender = session.createSender(queue);
sender.setDeliveryMode(DeliveryMode.PERSISTENT);
sender.setTimeToLive(3*24*60*60*1000);
ObjectMessage objectMessage = session.createObjectMessage();
objectMessage.setObject(message);
sender.send(objectMessage);
queueConnection.close();
接收消息代码如下
if(queueConnection == null){
try {
queueConnection = connectionFactory.createQueueConnection();
queueConnection.start();
} catch (JMSException e) {
logger.error(e.getMessage(), e);
}
}
try {
QueueSession queueSession = queueConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
Queue queue = queueSession.createQueue(String.valueOf(fid)+"-"+String.valueOf(userId));
QueueReceiver queueReceiver = queueSession.createReceiver(queue);
queueReceiver.setMessageListener(new MessageListener() {
public void onMessage(javax.jms.Message message) {
logger.info("接收到消息类型:"+message.getClass());
if(message instanceof ObjectMessage){
if(messageMap.containsKey(fid)){
try {
ObjectMessage objectMessage = (ObjectMessage)message;
SingleMessage singleMessage = (SingleMessage) objectMessage.getObject();
logger.info(singleMessage.getBody());
messageMap.get(fid).getMessages().add(singleMessage);
objectMessage.acknowledge();
} catch (JMSException e) {
logger.error(e.getMessage(), e);
}
}
}
}
});
SingleChat singleChat = new SingleChat();
singleChat.setSession(queueSession);
messageMap.put(fid, singleChat);
/**
* 包装连接和消息列表的内部类
*/
private class SingleChat{
private QueueSession session = null;
private List<SingleMessage> messages = new ArrayList<SingleMessage>();
public QueueSession getSession() {
return session;
}
public void setSession(QueueSession session) {
this.session = session;
}
public List<SingleMessage> getMessages() {
return messages;
}
}