JAVA----activeMQ -点对点

 最近在学习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;
		}
	}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值