直接上代码
发布主题
package com.activemq;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class TopicPub {
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);
/**
Session javax.jms.Connection.createSession(boolean transacted, int acknowledgeMode) throws JMSException
1.transacted事务,事务成功commit,才会将消息发送到mom中
2.acknowledgeMode消息确认机制
1)、带事务的session
如果session带有事务,并且事务成功提交,则消息被自动签收。如果事务回滚,则消息会被再次传送。
2)、不带事务的session
不带事务的session的签收方式,取决于session的配置。
Activemq支持一下三種模式:
Session.AUTO_ACKNOWLEDGE 消息自动签收
Session.CLIENT_ACKNOWLEDGE 客戶端调用acknowledge方法手动签收
Session.DUPS_OK_ACKNOWLEDGE 不是必须签收,消息可能会重复发送。在第二次重新传送消息的时候,消息
头的JmsDelivered会被置为true标示当前消息已经传送过一次,客户端需要进行消息的重复处理控制。
代码示例如下:
session = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE);
textMsg.acknowledge();
*/
Topic topic = session.createTopic("wm5920.topic");
MessageProducer producer = session.createProducer(topic);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//设置非持久化
// producer.setTimeToLive(5000);//5秒后过期,这个对点对点模式有效
TextMessage message = session.createTextMessage();
message.setText("message_" + System.currentTimeMillis());
producer.send(message);
System.out.println("Sent message: " + message.getText());
session.close();
connection.stop();
connection.close();
}
}
订阅主题,注:如果在发布主题前,没有订阅,是收不到消息的,这跟点对点的队列模式不同
package com.activemq;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class TopicSubs{
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.setClientID("wm5920");
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("wm5920.topic");
//持久订阅方式,不会漏掉信息
TopicSubscriber subs=session.createDurableSubscriber(topic, "wm5920");
subs.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();
}
}
});
//非持久订阅方式
// MessageConsumer consumer = session.createConsumer(topic);
// 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();
// }
// }
// });
// session.commit();
// session.close();
// connection.stop();
// connection.close();
}
}