一个关于JMS的问题,长期使用造成死机

userapplewings 2013-10-25 04:47:53
我用jms做了一个页面聊天程序,发送端是用ajax发送,接收端是用ajax每秒心跳接收,但是频繁死机,如果不发消息还好,可能不会死机,或者死机来的慢一点,我今天做压力测试,在发送端用js死循环不停调用发送端的ajax发送消息,第一次2分钟电脑死机(完全死掉了,鼠标什么的全不能动了),重启后再测没死,后来再测又死机了大约五六分钟的时候,这个死机是不定期的,有时候一启动很快就死了,有时候就比较长,请问会是什么原因造成的?我在网上查都查不到相关的案例,我简述一下我的程序流程吧:

发送端: 页面上输入文字-》点击发送-》ajax把消息传到后台-》后台建立于ActiveMQ的连接-》发送消息
接收端:由于是基于浏览器的web程序,受限于与服务器的请求响应模式,所以没用监听器,是通过每秒钟心跳完成的
每秒钟ajax请求后台相关程序-》程序建立于activeMQ的连接-》调用receive()方法接收消息-》如果有消息返回给浏览器,如果没有则返回空-》前台如果接到消息,显示在页面上,如果收到空,什么也不做

就是这个流程,我找了半天,不知道什么原因造成的死机,总之一开服务器(项目服务器用的Jboss),再开消息服务器(ActiveMQ),再开两个浏览器登陆两个账号,运行测试代码循环发送消息,就会造成不定期死机
我在网上查,怀疑是activeMQ需要优化一下,但是看网上的案例,不优化顶多就是慢,数据囤积太大造成阻塞,也没有说会死机的
...全文
242 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
userapplewings 2014-03-24
  • 打赏
  • 举报
回复
最终也没验证究竟是不是代码的问题,估计不是,我后来换了台稍高一点配置的电脑,这问题就再也没出现过了,哪怕压力测试的压力在翻上一倍也没出问题,估计是我原来的电脑太落后了吧,6年前的货色了
userapplewings 2013-10-29
  • 打赏
  • 举报
回复
引用 6 楼 lawrence860104 的回复:
关注一下 最好把代码贴一贴 接收端的
先将代码贴上,发送与接收方法,这两个方法不是在一个类里面

public void send() throws Exception{
		//获取链接工厂(ActiveMQ消息服务方式)
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://" + PropertiesRead.getPropertie("msg.ip") + ":" + PropertiesRead.getPropertie("msg.port"));
		//从连接工厂获取连接
		Connection connection = connectionFactory.createConnection();
		//通过连接获取JMS会话
		Session session = connection.createSession(false, QueueSession.CLIENT_ACKNOWLEDGE);	
		//获取消息目的(ActiveMQ消息服务方式)
		Destination destination = session.createQueue("MessageQueue");
		//用session创建消息生产者,并指定消息目的地
		MessageProducer messageProducer = session.createProducer(destination);
		//设置消息生产者生产的消息的 传递模式以及有效时间(非必须)
		messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
		messageProducer.setTimeToLive(0);
//		connection.start();
                 //flag是我用来标注即将要发的消息的类型,不同类型的我做不同处理,flag可以当做是正确的,它是这个类的一个成员变量,成员变量的定义,和发送接收无关,我就不都拿出来了
		if("text".equals(flag)){
			TextMessage textMessage = session.createTextMessage();
                        //这面这一堆都是给消息添加一些需要的属性
			textMessage.setStringProperty("fromUser", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId());
			if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName());
			}else if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser());
			}else{
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentIp());
			}
			textMessage.setStringProperty("fromUserHead", ((TdAgent)request.getSession().getAttribute("loginUsers")).getPicture());
			textMessage.setStringProperty("toUser", this.toUser);
			textMessage.setStringProperty("messageType", "text");
			textMessage.setStringProperty("sendTime", DateUtils.getStringFromDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
			textMessage.setText(this.msg);
//			System.out.println(((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId() + "---" + this.toUser + "---" + this.msg);
			messageProducer.send(textMessage);
		}else if("file".equals(flag)){
			String saveName = FileUtils.saveFile(file, fileFileName, "/uploadfile");
			String httpPath = FileUtils.getHttpDownloadPath("/uploadfile", saveName);
			TextMessage textMessage = session.createTextMessage();
			textMessage.setStringProperty("fromUser", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId());
			if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName());
			}else if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser());
			}else{
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentIp());
			}
			textMessage.setStringProperty("fromUserHead", ((TdAgent)request.getSession().getAttribute("loginUsers")).getPicture());
			textMessage.setStringProperty("toUser", this.toUser);
			textMessage.setStringProperty("messageType", "file");
			textMessage.setStringProperty("fileName", this.fileFileName);
			textMessage.setStringProperty("saveName", saveName);
			textMessage.setStringProperty("sendTime", DateUtils.getStringFromDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
			textMessage.setText(httpPath);
//			System.out.println(((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId() + "---" + this.toUser + "---" + this.fileFileName);
			messageProducer.send(textMessage);
		}
		//关闭资源
		if(null != messageProducer){
			messageProducer.close();
		}
		if(null != messageProducer){
			session.close();
		}
		if(null != messageProducer){
			connection.close();
		}
	}


/**消息接收,我是用的一个消息接收工具类,在构造方法里面传入要接收人是谁,然后根据消息选择器在消息队列中获取属于自己的消息,获取完消息后,把消息封装进MessageBean,然后外面的类可以通过getMessageBean获取到消息,再调用close方法关闭连接*/
public MessageReceiveUtils(String receiveUser) throws Exception{
		//获取链接工厂(ActiveMQ消息服务方式)
		this.connFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://" + PropertiesRead.getPropertie("msg.ip") + ":" + PropertiesRead.getPropertie("msg.port"));
		//连接工厂创建连接
		this.conn = connFactory.createConnection();
		//JMS连接创建JMS会话
		this.session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//获取消息目的(ActiveMQ消息服务方式)
		this.dest = session.createQueue("MessageQueue");
		//JMS会话创建消息消费者
		this.receiver = session.createConsumer(dest,"toUser = '" + receiveUser + "'");
		//启动JMS连接,让它开始传输JMS消息
		conn.start();
		Message msg = (TextMessage)receiver.receive(500);
		if(null != msg && msg instanceof TextMessage){
			TextMessage textMessage = (TextMessage)msg;
			try {
				String flag = textMessage.getStringProperty("messageType");
				if("text".equals(flag)){
					this.messageBean = new MessageBean();
					this.messageBean.setMsgContent(textMessage.getText());
					this.messageBean.setMsgType(flag);
					this.messageBean.setFromUser(textMessage.getStringProperty("fromUser"));
					this.messageBean.setFromUserName(textMessage.getStringProperty("fromUserName"));
					this.messageBean.setFromUserHead(textMessage.getStringProperty("fromUserHead"));
					this.messageBean.setToUser(textMessage.getStringProperty("toUser"));
					this.messageBean.setSendTime(textMessage.getStringProperty("sendTime"));
//					System.out.println(receiveUser + "获取了" + textMessage.getStringProperty("fromUser") +"的消息:" + textMessage.getText());
				}else if("file".equals(flag)){
					this.messageBean = new MessageBean();
					String fileName = textMessage.getStringProperty("fileName");
					String saveName = textMessage.getStringProperty("saveName");
					String fromUserName = textMessage.getStringProperty("fromUserName");
					String mess = "给您发送了文件:" + fileName + " 服务器将为您保存3天,<a href='downloadFile.action?fileName=" + saveName + "&showFileName=" + fileName + "'>点此下载</a>";
					this.messageBean.setMsgContent(mess);
					this.messageBean.setMsgType(flag);
					this.messageBean.setFromUser(textMessage.getStringProperty("fromUser"));
					this.messageBean.setFromUserName(fromUserName);
					this.messageBean.setFromUserHead(textMessage.getStringProperty("fromUserHead"));
					this.messageBean.setToUser(textMessage.getStringProperty("toUser"));
					this.messageBean.setSendTime(textMessage.getStringProperty("sendTime"));
//					System.out.println(receiveUser + "获取了" + textMessage.getStringProperty("fromUser") +"的消息:" + textMessage.getText());
				}
			} catch (JMSException e) {
				e.printStackTrace();
			}
		}
	}
/**
	 * 消息连接关闭
	 */
	public void close(){
		try{
			if (this.receiver != null)
				this.receiver.close();
			if (this.session != null)
				this.session.close();
			if (this.conn != null)
				this.conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

public MessageBean getMessageBean() {
		return messageBean;
	}

zpengoice 2013-10-29
  • 打赏
  • 举报
回复
将代码贴上来看看
userapplewings 2013-10-29
  • 打赏
  • 举报
回复
引用 5 楼 zxcvbnm11920 的回复:
你改下你的死循环改成ajax返回结果后再发起下一次,这样测试下看看。开始也没问清楚,是发送端死机还是客户端死机?
死机发生在jboss服务器上
userapplewings 2013-10-29
  • 打赏
  • 举报
回复
引用 16 楼 lawrence860104 的回复:
[quote=引用 15 楼 userapplewings 的回复:] [quote=引用 6 楼 lawrence860104 的回复:] 关注一下 最好把代码贴一贴 接收端的
先将代码贴上,发送与接收方法,这两个方法不是在一个类里面

public void send() throws Exception{
		//获取链接工厂(ActiveMQ消息服务方式)
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://" + PropertiesRead.getPropertie("msg.ip") + ":" + PropertiesRead.getPropertie("msg.port"));
		//从连接工厂获取连接
		Connection connection = connectionFactory.createConnection();
		//通过连接获取JMS会话
		Session session = connection.createSession(false, QueueSession.CLIENT_ACKNOWLEDGE);	
		//获取消息目的(ActiveMQ消息服务方式)
		Destination destination = session.createQueue("MessageQueue");
		//用session创建消息生产者,并指定消息目的地
		MessageProducer messageProducer = session.createProducer(destination);
		//设置消息生产者生产的消息的 传递模式以及有效时间(非必须)
		messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
		messageProducer.setTimeToLive(0);
//		connection.start();
                 //flag是我用来标注即将要发的消息的类型,不同类型的我做不同处理,flag可以当做是正确的,它是这个类的一个成员变量,成员变量的定义,和发送接收无关,我就不都拿出来了
		if("text".equals(flag)){
			TextMessage textMessage = session.createTextMessage();
                        //这面这一堆都是给消息添加一些需要的属性
			textMessage.setStringProperty("fromUser", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId());
			if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName());
			}else if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser());
			}else{
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentIp());
			}
			textMessage.setStringProperty("fromUserHead", ((TdAgent)request.getSession().getAttribute("loginUsers")).getPicture());
			textMessage.setStringProperty("toUser", this.toUser);
			textMessage.setStringProperty("messageType", "text");
			textMessage.setStringProperty("sendTime", DateUtils.getStringFromDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
			textMessage.setText(this.msg);
//			System.out.println(((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId() + "---" + this.toUser + "---" + this.msg);
			messageProducer.send(textMessage);
		}else if("file".equals(flag)){
			String saveName = FileUtils.saveFile(file, fileFileName, "/uploadfile");
			String httpPath = FileUtils.getHttpDownloadPath("/uploadfile", saveName);
			TextMessage textMessage = session.createTextMessage();
			textMessage.setStringProperty("fromUser", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId());
			if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName());
			}else if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser());
			}else{
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentIp());
			}
			textMessage.setStringProperty("fromUserHead", ((TdAgent)request.getSession().getAttribute("loginUsers")).getPicture());
			textMessage.setStringProperty("toUser", this.toUser);
			textMessage.setStringProperty("messageType", "file");
			textMessage.setStringProperty("fileName", this.fileFileName);
			textMessage.setStringProperty("saveName", saveName);
			textMessage.setStringProperty("sendTime", DateUtils.getStringFromDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
			textMessage.setText(httpPath);
//			System.out.println(((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId() + "---" + this.toUser + "---" + this.fileFileName);
			messageProducer.send(textMessage);
		}
		//关闭资源
		if(null != messageProducer){
			messageProducer.close();
		}
		if(null != messageProducer){
			session.close();
		}
		if(null != messageProducer){
			connection.close();
		}
	}


/**消息接收,我是用的一个消息接收工具类,在构造方法里面传入要接收人是谁,然后根据消息选择器在消息队列中获取属于自己的消息,获取完消息后,把消息封装进MessageBean,然后外面的类可以通过getMessageBean获取到消息,再调用close方法关闭连接*/
public MessageReceiveUtils(String receiveUser) throws Exception{
		//获取链接工厂(ActiveMQ消息服务方式)
		this.connFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://" + PropertiesRead.getPropertie("msg.ip") + ":" + PropertiesRead.getPropertie("msg.port"));
		//连接工厂创建连接
		this.conn = connFactory.createConnection();
		//JMS连接创建JMS会话
		this.session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//获取消息目的(ActiveMQ消息服务方式)
		this.dest = session.createQueue("MessageQueue");
		//JMS会话创建消息消费者
		this.receiver = session.createConsumer(dest,"toUser = '" + receiveUser + "'");
		//启动JMS连接,让它开始传输JMS消息
		conn.start();
		Message msg = (TextMessage)receiver.receive(500);
		if(null != msg && msg instanceof TextMessage){
			TextMessage textMessage = (TextMessage)msg;
			try {
				String flag = textMessage.getStringProperty("messageType");
				if("text".equals(flag)){
					this.messageBean = new MessageBean();
					this.messageBean.setMsgContent(textMessage.getText());
					this.messageBean.setMsgType(flag);
					this.messageBean.setFromUser(textMessage.getStringProperty("fromUser"));
					this.messageBean.setFromUserName(textMessage.getStringProperty("fromUserName"));
					this.messageBean.setFromUserHead(textMessage.getStringProperty("fromUserHead"));
					this.messageBean.setToUser(textMessage.getStringProperty("toUser"));
					this.messageBean.setSendTime(textMessage.getStringProperty("sendTime"));
//					System.out.println(receiveUser + "获取了" + textMessage.getStringProperty("fromUser") +"的消息:" + textMessage.getText());
				}else if("file".equals(flag)){
					this.messageBean = new MessageBean();
					String fileName = textMessage.getStringProperty("fileName");
					String saveName = textMessage.getStringProperty("saveName");
					String fromUserName = textMessage.getStringProperty("fromUserName");
					String mess = "给您发送了文件:" + fileName + " 服务器将为您保存3天,<a href='downloadFile.action?fileName=" + saveName + "&showFileName=" + fileName + "'>点此下载</a>";
					this.messageBean.setMsgContent(mess);
					this.messageBean.setMsgType(flag);
					this.messageBean.setFromUser(textMessage.getStringProperty("fromUser"));
					this.messageBean.setFromUserName(fromUserName);
					this.messageBean.setFromUserHead(textMessage.getStringProperty("fromUserHead"));
					this.messageBean.setToUser(textMessage.getStringProperty("toUser"));
					this.messageBean.setSendTime(textMessage.getStringProperty("sendTime"));
//					System.out.println(receiveUser + "获取了" + textMessage.getStringProperty("fromUser") +"的消息:" + textMessage.getText());
				}
			} catch (JMSException e) {
				e.printStackTrace();
			}
		}
	}
/**
	 * 消息连接关闭
	 */
	public void close(){
		try{
			if (this.receiver != null)
				this.receiver.close();
			if (this.session != null)
				this.session.close();
			if (this.conn != null)
				this.conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

public MessageBean getMessageBean() {
		return messageBean;
	}

[/quote] onMessage那部分怎么写的?[/quote] onMessage是jms监听器接收吧,我没有用监听器,因为我做的是一个页面聊天程序,浏览器和服务器之间收到“请求-响应”模式的限制,所以即便onMessage监听到了消息,消息也依旧在服务器端没法主动发给浏览器,所以没有采用onMessage这种异步监听的方法,而用的receive()方法,这个是同步接收方法,浏览器每一秒钟轮循ajax访问服务器收一次消息,如果有消息就通过ajax直接带回浏览器了
  • 打赏
  • 举报
回复
引用 15 楼 userapplewings 的回复:
[quote=引用 6 楼 lawrence860104 的回复:] 关注一下 最好把代码贴一贴 接收端的
先将代码贴上,发送与接收方法,这两个方法不是在一个类里面

public void send() throws Exception{
		//获取链接工厂(ActiveMQ消息服务方式)
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://" + PropertiesRead.getPropertie("msg.ip") + ":" + PropertiesRead.getPropertie("msg.port"));
		//从连接工厂获取连接
		Connection connection = connectionFactory.createConnection();
		//通过连接获取JMS会话
		Session session = connection.createSession(false, QueueSession.CLIENT_ACKNOWLEDGE);	
		//获取消息目的(ActiveMQ消息服务方式)
		Destination destination = session.createQueue("MessageQueue");
		//用session创建消息生产者,并指定消息目的地
		MessageProducer messageProducer = session.createProducer(destination);
		//设置消息生产者生产的消息的 传递模式以及有效时间(非必须)
		messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
		messageProducer.setTimeToLive(0);
//		connection.start();
                 //flag是我用来标注即将要发的消息的类型,不同类型的我做不同处理,flag可以当做是正确的,它是这个类的一个成员变量,成员变量的定义,和发送接收无关,我就不都拿出来了
		if("text".equals(flag)){
			TextMessage textMessage = session.createTextMessage();
                        //这面这一堆都是给消息添加一些需要的属性
			textMessage.setStringProperty("fromUser", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId());
			if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName());
			}else if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser());
			}else{
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentIp());
			}
			textMessage.setStringProperty("fromUserHead", ((TdAgent)request.getSession().getAttribute("loginUsers")).getPicture());
			textMessage.setStringProperty("toUser", this.toUser);
			textMessage.setStringProperty("messageType", "text");
			textMessage.setStringProperty("sendTime", DateUtils.getStringFromDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
			textMessage.setText(this.msg);
//			System.out.println(((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId() + "---" + this.toUser + "---" + this.msg);
			messageProducer.send(textMessage);
		}else if("file".equals(flag)){
			String saveName = FileUtils.saveFile(file, fileFileName, "/uploadfile");
			String httpPath = FileUtils.getHttpDownloadPath("/uploadfile", saveName);
			TextMessage textMessage = session.createTextMessage();
			textMessage.setStringProperty("fromUser", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId());
			if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getNickName());
			}else if(null != ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser() && !"".equals(((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser())){
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getBelongUser());
			}else{
				textMessage.setStringProperty("fromUserName", ((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentIp());
			}
			textMessage.setStringProperty("fromUserHead", ((TdAgent)request.getSession().getAttribute("loginUsers")).getPicture());
			textMessage.setStringProperty("toUser", this.toUser);
			textMessage.setStringProperty("messageType", "file");
			textMessage.setStringProperty("fileName", this.fileFileName);
			textMessage.setStringProperty("saveName", saveName);
			textMessage.setStringProperty("sendTime", DateUtils.getStringFromDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
			textMessage.setText(httpPath);
//			System.out.println(((TdAgent)request.getSession().getAttribute("loginUsers")).getAgentId() + "---" + this.toUser + "---" + this.fileFileName);
			messageProducer.send(textMessage);
		}
		//关闭资源
		if(null != messageProducer){
			messageProducer.close();
		}
		if(null != messageProducer){
			session.close();
		}
		if(null != messageProducer){
			connection.close();
		}
	}


/**消息接收,我是用的一个消息接收工具类,在构造方法里面传入要接收人是谁,然后根据消息选择器在消息队列中获取属于自己的消息,获取完消息后,把消息封装进MessageBean,然后外面的类可以通过getMessageBean获取到消息,再调用close方法关闭连接*/
public MessageReceiveUtils(String receiveUser) throws Exception{
		//获取链接工厂(ActiveMQ消息服务方式)
		this.connFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://" + PropertiesRead.getPropertie("msg.ip") + ":" + PropertiesRead.getPropertie("msg.port"));
		//连接工厂创建连接
		this.conn = connFactory.createConnection();
		//JMS连接创建JMS会话
		this.session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//获取消息目的(ActiveMQ消息服务方式)
		this.dest = session.createQueue("MessageQueue");
		//JMS会话创建消息消费者
		this.receiver = session.createConsumer(dest,"toUser = '" + receiveUser + "'");
		//启动JMS连接,让它开始传输JMS消息
		conn.start();
		Message msg = (TextMessage)receiver.receive(500);
		if(null != msg && msg instanceof TextMessage){
			TextMessage textMessage = (TextMessage)msg;
			try {
				String flag = textMessage.getStringProperty("messageType");
				if("text".equals(flag)){
					this.messageBean = new MessageBean();
					this.messageBean.setMsgContent(textMessage.getText());
					this.messageBean.setMsgType(flag);
					this.messageBean.setFromUser(textMessage.getStringProperty("fromUser"));
					this.messageBean.setFromUserName(textMessage.getStringProperty("fromUserName"));
					this.messageBean.setFromUserHead(textMessage.getStringProperty("fromUserHead"));
					this.messageBean.setToUser(textMessage.getStringProperty("toUser"));
					this.messageBean.setSendTime(textMessage.getStringProperty("sendTime"));
//					System.out.println(receiveUser + "获取了" + textMessage.getStringProperty("fromUser") +"的消息:" + textMessage.getText());
				}else if("file".equals(flag)){
					this.messageBean = new MessageBean();
					String fileName = textMessage.getStringProperty("fileName");
					String saveName = textMessage.getStringProperty("saveName");
					String fromUserName = textMessage.getStringProperty("fromUserName");
					String mess = "给您发送了文件:" + fileName + " 服务器将为您保存3天,<a href='downloadFile.action?fileName=" + saveName + "&showFileName=" + fileName + "'>点此下载</a>";
					this.messageBean.setMsgContent(mess);
					this.messageBean.setMsgType(flag);
					this.messageBean.setFromUser(textMessage.getStringProperty("fromUser"));
					this.messageBean.setFromUserName(fromUserName);
					this.messageBean.setFromUserHead(textMessage.getStringProperty("fromUserHead"));
					this.messageBean.setToUser(textMessage.getStringProperty("toUser"));
					this.messageBean.setSendTime(textMessage.getStringProperty("sendTime"));
//					System.out.println(receiveUser + "获取了" + textMessage.getStringProperty("fromUser") +"的消息:" + textMessage.getText());
				}
			} catch (JMSException e) {
				e.printStackTrace();
			}
		}
	}
/**
	 * 消息连接关闭
	 */
	public void close(){
		try{
			if (this.receiver != null)
				this.receiver.close();
			if (this.session != null)
				this.session.close();
			if (this.conn != null)
				this.conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

public MessageBean getMessageBean() {
		return messageBean;
	}

[/quote] onMessage那部分怎么写的?
userapplewings 2013-10-28
  • 打赏
  • 举报
回复
引用 10 楼 sjlzcj 的回复:
MQ的 连接使用完关闭了吗?
你指的是connect.close()这个方法吧,关了,MQ里面凡是带close()方法的都执行close了 多打了两个字,没有“除了”
userapplewings 2013-10-28
  • 打赏
  • 举报
回复
引用 10 楼 sjlzcj 的回复:
MQ的 连接使用完关闭了吗?
你指的是connect.close()这个方法吧,关了,除了jms里面凡是带close()方法的都执行close了
sjlzcj 2013-10-28
  • 打赏
  • 举报
回复
MQ的 连接使用完关闭了吗?
userapplewings 2013-10-28
  • 打赏
  • 举报
回复
引用 6 楼 lawrence860104 的回复:
关注一下 最好把代码贴一贴 接收端的
非常感谢你的关注,我明天再测试一下究竟问题出在谁身上,再发代码上来
userapplewings 2013-10-28
  • 打赏
  • 举报
回复
引用 5 楼 zxcvbnm11920 的回复:
你改下你的死循环改成ajax返回结果后再发起下一次,这样测试下看看。开始也没问清楚,是发送端死机还是客户端死机?
也怪我,没想到这个事,一语点醒梦中人,我一直以来测试都是 项目服务器、消息服务器、客户浏览器全在一天电脑上,现在下班了,我明天开三天电脑,一台客户端、一台项目服务器、一台消息服务器,看看到底是谁的问题,太感谢你了,我一直没想到这个问题,明天看看到底是谁的问题
小绵羊 2013-10-28
  • 打赏
  • 举报
回复
window.setInterval('test()',500);之前先把上一次的清理掉


var timer = null;

if(timer!=null){
    window.clearInterval(timer);
}
timer=window.setInterval('test()',500);
  • 打赏
  • 举报
回复
关注一下 最好把代码贴一贴 接收端的
骑士的崛起 2013-10-28
  • 打赏
  • 举报
回复
你改下你的死循环改成ajax返回结果后再发起下一次,这样测试下看看。开始也没问清楚,是发送端死机还是客户端死机?
userapplewings 2013-10-26
  • 打赏
  • 举报
回复
引用 3 楼 rainbowsix 的回复:
死机是开的线程太多了。 为什么线程太多。检查自己的代码
怎么算打开一个线程了呢?是不是前台js的一个window.setInterval('test()',500);这个就算开一个线程了呢?
无聊找乐 2013-10-26
  • 打赏
  • 举报
回复
死机是开的线程太多了。 为什么线程太多。检查自己的代码
userapplewings 2013-10-25
  • 打赏
  • 举报
回复
引用 1 楼 zxcvbnm11920 的回复:
把你js死循环发出来看看,是不是这个写的有问题。
function test(){ $(".text_input").html("消息"); //这个人是网文本框里放文字 send();//这个是调用ajax所在的函数,执行发送 } 然后用window.setInterval('test()',500);//半秒钟一次的速度调用
骑士的崛起 2013-10-25
  • 打赏
  • 举报
回复
把你js死循环发出来看看,是不是这个写的有问题。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧