activemq相关示例

topic send

package org.arrow.amq.test;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTopic;

import javax.jms.*;

/**
 * 订阅发布
 */
public class TopicSender {

    public static void main(String[] args) throws JMSException {

        ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
        Connection connection = factory.createConnection();
        connection.start();

        // session用来支持事务的,如果不用session
        Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);

        // send分为同步发送和异步发送,同步发送会等服务器的ACK, 异步发送不会等,但可能会丢消息
        // 但当开启session事务时,所有的send均变成异步的,只有在commit时才会堵塞等待

        // Topic继承自Destination
        Topic topic = session.createTopic("TestTopic1");
        MessageProducer producer = session.createProducer(topic);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        for(int i = 0 ; i < 10; i++){
            producer.send(session.createObjectMessage("topic hello world..." + i));
        }
        System.out.println("sent topic...");
        session.close();
        connection.close();
    }

}

topic receiver


package org.arrow.amq.test;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class TopicReceiver {

    public static void main(String[] args) throws JMSException {
        // 连接工厂
        ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
        // 获取连接
        Connection connection = factory.createConnection();
        connection.start();
        // 生成session, 参数1true,开启事务,必须commit确认消费,false时,自动应答
        //  true + Session.AUTO_ACKNOWLEDGE  : 不commit时不会确认消费
        //  false + Session.AUTO_ACKNOWLEDGE : 接受到即确认消费
        //  false + Session.CLIENT_ACKNOWLEDGE: 不自动确认,需要手动确认  message.acknowledge()确认消费
        //  false + Session.DUPS_OK_ACKNOWLEDGE  不需要确认,也会自动消费

        // AUTO_ACKNOWLEDGE:自动确认模式。
        // DUPS_OK_ACKNOWLEDGE:允许确认模式的副本。接收应用程序来处理在会话对象的方法调用返回的消息后会收到一条确认消息,并允许重复确认。
        // CLIENT_ACKNOWLEDGE 客户端手动确认
        // 重要: true时将忽略b值,自动被设为SESSION_TRANSACTED

        Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        // 操作目标队列或主题 queue("TestQueue") 或 session.createTopic("TestTopic")
        Topic topic = session.createTopic("TestTopic1");
        // 生成消费者
        MessageConsumer consumer1 = session.createConsumer(topic);
        MessageConsumer consumer2 = session.createConsumer(topic);
        // 方式1,使用consumer.receive()
//        ObjectMessage message = (ObjectMessage)consumer.receive();
//        if (message != null) {
//            String messageString = (String)message.getObject();
//            System.out.println("Receive1 : " + messageString);
//        }
        // 方式2:注册一个listener
        consumer1.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                Object object = null;
                try {
                    object = ((ObjectMessage) message).getObject();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
                System.out.println("topic Receive2-1 : " + (String)object);
            }
        });

        consumer2.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                Object object = null;
                try {
                    object = ((ObjectMessage) message).getObject();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
                System.out.println("topic Receive2-2 : " + (String)object);
            }
        });


//        session.close();
//        connection.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值