activemq的topic消息一直都会存在数据库中,为什么不会删除
java吧
全部回复
仅看楼主
level 1
luyuanwu003 楼主
我把消息设置的持久化到数据库。采用topic的方式发送消息。
每次发送消息之后,数据库的ACTIVEMQ_MSGS表里都会插入10条记录(每次是发送10条消息),在接收端接收消息之后,ACTIVEMQ_MSGS表里的数据没有被删掉,求大神帮忙给看看。(采用queue方式发送消息,接收端没接收消息之前,ACTIVEMQ_MSGS表里有数据,接收之后ACTIVEMQ_MSGS的数据库就自动被删掉了)
发送端的代码如下;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TopicPublisher {
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("myTopic.messages");
MessageProducer producer = session.createProducer(topic);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
for(int i =0;i<10;i++){
TextMessage message = session.createTextMessage();
message.setText("message_" + System.currentTimeMillis());
producer.send(message);
System.out.println("Sent message: " + message.getText());
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
session.close();
connection.stop();
connection.close();
}
}
接收端的代码如下:
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TopicSubscriber {
/**
* @param args
*/
public static void main(String[] args) {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
try {
Connection connection = factory.createConnection();
connection.setClientID("null");
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("myTopic.messages");
MessageConsumer consumer = session.createDurableSubscriber(topic,"123");
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
try {
System.out.println("Received message: " + tm.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
} catch (JMSException e) {
e.printStackTrace();
}
}
}
2014年05月23日 07点05分 1
level 1
luyuanwu003 楼主
求大神解释
2014年05月23日 07点05分 2
level 1
我也是新接触这个
queue方式消费之后应该就相当于dequeue了,会自动删除
topic主题方式消费时候不会删除,被订阅了也是能查询所有消息的
我是这么理解的
2014年06月30日 02点06分 3
level 15
如果没有什么好的办法,或者AMQ本身的配置并不能解决这个问题,是不是可以考虑从程序里面入手,增加一个计划任务,用于定期删除无用的数据,或者利用数据库本身的任务计划来删除。
AMQ本身是有支持限制持久化存储空间大小的功能,但貌似有问题,以前也有遇到过日志文件过大把硬盘占满的情况,配置貌似有时候并不能生效。
2016年08月10日 03点08分 6
level 8
queue被消费以后这条消息就没用了,因为这个的一对一的,一条消息只能被一个消费者消费,但是topic是一对多的,您用一个订阅者消费后,如何就删除了topic,其他订阅者上线以后,如何得到离线这段期间发送的数据呢?
2017年08月10日 04点08分 7
level 3
现在有解决了吗?我也出现这种情况,在queue里面没这问题,但是在topic里面,每次所有订阅者消费完以后,topic在数据库里的消息总会滞后一段时间后才会删除。这样虽然不会导致数据库占满,但是在做监控的时候看起来就会很怪异。另外,有么有什么办法,让已消费的数据库已删除的消息,仍然可以查询到
2017年11月18日 05点11分 8
1