第十二章 客户端新特性的选项

本文介绍了 ActiveMQ 中的高级特性,包括互斥消费者确保消息处理的顺序性、消息组实现特定消费者的消息传递、使用 ActiveMQ 流和 Blob 消息高效传输大文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:涉及到客户端选项,主要有队列优秀属性(exclusive consumers【互斥消费者】 和message groups【消息组】)和如何处理大的消息

12.1、互斥消费者(Exclusive Consumer)

为保证消息处理的顺序性,每一次单个会话只要一个MessageListeners(消息监听器进行处理),只有MessageListeners挂掉,其他MessageListeners顶上去。


可以普通消费者和互斥消费者同时同时处理同一个队列,只会将消息让给其中一个互斥消费者处理,只要所有互斥消费者没有被激活,这时候才会传递给普通消费者处理

创建一个互斥消费

queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true");
consumer = session.createConsumer(queue);

12.1.1.互斥消费者例子

互斥生产者


创建一个互斥消费者

public void start() throws JMSException {
this.connection = this.factory.createConnection();
this.connection.start();
this.session = this.connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Destination destination = this.session.createQueue(this.queueName + "?consumer.exclusive=Message message = this.session.createMessage();
MessageProducer producer = this.session.createProducer(destination);
producer.send(message);
MessageConsumer consumer = this.session.createConsumer(destination);
consumer.setMessageListener(this);
}

MessageListener 监听互斥生产者

public void onMessage( Message message )
{
	if ( message != null && this.active == false )
	{
		this.active = true;
		startProducing();
	}
}

12.2、消息组

消息组就是在消息头添加JMSXGroupID属性来标志发送到特定消费者


创建一个消息组

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("group.queue");
MessageProducer producer = session.createProducer(queue);
Message message = session.createTextMessage("
<foo>test</foo>
");
message.setStringProperty("JMSXGroupID", "TEST_GROUP_A");
producer.send(message);

关闭消息组,可以设置属性JMSXGroupSeq = -1

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("group.queue");
MessageProducer producer = session.createProducer(queue);
<foo></foo>
Message message = session.createTextMessage("
<foo>close</foo>
");
message.setStringProperty("JMSXGroupID", "TEST_GROUP_A");
message.setIntProperty("JMSXGroupSeq", -1);
producer.send(message);
检查启动一个新的消息组()

Session session = MessageConsumer consumer = session.createConsumer(queue);
Message message = consumer.receive();
String groupId = message.getStringProperty("JMSXGroupId");
if (message.getBooleanProperty("JMSXGroupFirstForConsumer")) {
// do processing for new group
}
等待消费者之前分配消息组

<destinationPolicy>
    <policyMap>
        <policyEntries>
            <policyEntry queue=">" consumersBeforeDispatchStarts="2" timeBeforeDispatchStarts="5000" />
        </policyEntries>
    </policyMap>
</destinationPolicy>

12.3、ActiveMQ流

传输大文件,分块传递(JMS流)


发送数据通过ActiveMQ流

//source of our large data
FileInputStream in = new FileInputStream("largetextfile.txt");
String brokerURI = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURI);
ActiveMQConnection connection = (ActiveMQConnection) connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue destination = session.createQueue(QUEUE_NAME);
OutputStream out = connection.createOutputStream(destination);
//now write the file on to ActiveMQ
byte[] buffer = new byte[1024];
while(true){
int bytesRead = in.read(buffer);
if (bytesRead==-1){
break;
}
out.write(buffer,0,bytesRead);
}
//close the stream so the receiving side knows the steam is finished
out.close();

从ActiveMQ流中接受数据

//destination of our large data
FileOutputStream out = new FileOutputStream("copied.txt");
String brokerURI = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURI);
ActiveMQConnection connection = (ActiveMQConnection) connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//we want be be an exclusive consumer
String exclusiveQueueName= QUEUE_NAME + "?consumer.exclusive=true";
Queue destination = session.createQueue(exclusiveQueueName);
InputStream in = connection.createInputStream(destination);
//now write the file from ActiveMQ
byte[] buffer = new byte[1024];
while(true){
int bytesRead = in.read(buffer);
if (bytesRead==-1){
break;
}
out.write(buffer,0,bytesRead);
}
out.close();

12.4、Blob 消息

数据库就有这个数据格式

ActiveMQ封装一个BlobMessage对象

发送一个BlobMessage对象

String brokerURI = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURI);
Connection connection = connectionFactory.createConnection();
connection.start();
ActiveMQSession session = (ActiveMQSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue destination = session.createQueue(QUEUE_NAME);
MessageProducer producer = session.createProducer(destination);
BlobMessage message = session.createBlobMessage(new URL("http://some.shared.site.com"));
producer.send(message);
处理一个BlobMessage对象(通过流进行处理)

// destination of our Blob data
FileOutputStream out = new FileOutputStream("blob.txt");
String brokerURI = ActiveMQConnectionFactory.DEFAULT_BROKER_URL;
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURI);
Connection connection = (ActiveMQConnection) connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue destination = session.createQueue(QUEUE_NAME);
MessageConsumer consumer = session.createConsumer(destination);
BlobMessage blobMessage = (BlobMessage) consumer.receive();
InputStream in = blobMessage.getInputStream();
// now write the file from ActiveMQ
byte[] buffer = new byte[1024];
while (true) {
int bytesRead = in.read(buffer);
if (bytesRead == -1) {
break;
}
out.write(buffer, 0, bytesRead);
}
out.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值