(九):Selector

本文介绍如何使用Java消息服务(JMS)选择器仅接收感兴趣的特定消息。通过示例代码展示了如何创建两个消费者监听同一队列,但分别设置不同的选择器条件,从而实现按需接收消息。
前面的例子中创建一个消息消费者使用的是:
sesssion.createConsumer(destination)
另外,还提供了另一种方式:
sesssion.createConsumer(destination, selector)
这里selector是一个字符串,用来过滤消息。也就是说,这种方式可以创建一个可以只接收特定消息的一个消费者。Selector的格式是类似于SQL-92的一种语法。可以用来比较消息头信息和属性。

下面的例子中,创建两个消费者,共同监听同一个Queue,但是它们的Selector不同,然后创建一个消息生产者,来发送多个消息。
/**
*
*/
package selector;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

/**
* @author Wang Sheng(Josh)
*
* Consumer only receive the message which interested.
*
*/
public class JMSSelectorTest {

public static void main(String[] args) throws Exception {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
Connection connection = factory.createConnection();

connection.start();

Queue queue = new ActiveMQQueue("JoshSelectorQueue");
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

// the consumer only receive the message which properties is receiver equals A
MessageConsumer consumerA = session.createConsumer(queue, "receiver = 'A'");
consumerA.setMessageListener(new MessageListener() {

@Override
public void onMessage(Message message) {
try {
System.out.println("Consumer A get " + ((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}

}
});

MessageConsumer consumerB = session.createConsumer(queue, "receiver = 'B'");
consumerB.setMessageListener(new MessageListener() {

@Override
public void onMessage(Message message) {
try {
System.out.println("Consumer B get " + ((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}

}
});

MessageProducer producer = session.createProducer(queue);
for (int i = 0; i < 10; i ++) {
String receiver = i % 3 == 0 ? "A" : "B";
TextMessage message = session.createTextMessage("Message: " + i + ", receiver: " + receiver);
message.setStringProperty("receiver", receiver);
producer.send(message);
}

}

}
2025-08-13 10:13:03,603 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 64 [main] INFO [] - Get a module define from application.yml, module name: configuration 2025-08-13 10:13:03,608 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 68 [main] INFO [] - Get a provider define belong to configuration module, provider name: default 2025-08-13 10:13:03,608 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 64 [main] INFO [] - Get a module define from application.yml, module name: core 2025-08-13 10:13:03,608 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 68 [main] INFO [] - Get a provider define belong to core module, provider name: default 2025-08-13 10:13:03,609 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 64 [main] INFO [] - Get a module define from application.yml, module name: cluster 2025-08-13 10:13:03,609 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 68 [main] INFO [] - Get a provider define belong to cluster module, provider name: standalone 2025-08-13 10:13:03,609 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 64 [main] INFO [] - Get a module define from application.yml, module name: storage 2025-08-13 10:13:03,609 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 68 [main] INFO [] - Get a provider define belong to storage module, provider name: h2 2025-08-13 10:13:03,610 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 117 [main] INFO [] - Provider=h2 config=driver has been set as org.h2.jdbcx.JdbcDataSource 2025-08-13 10:13:03,610 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 117 [main] INFO [] - Provider=h2 config=url has been set as jdbc:h2:mem:skywalking-oap-db 2025-08-13 10:13:03,610 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 117 [main] INFO [] - Provider=h2 config=user has been set as sa 2025-08-13 10:13:03,696 - org.apache.skywalking.oap.server.starter.OAPServerBootstrap - 57 [main] ERROR [] - configuration module no provider found. org.apache.skywalking.oap.server.library.module.ProviderNotFoundException: configuration module no provider found. at org.apache.skywalking.oap.server.library.module.ModuleDefine.prepare(ModuleDefine.java:86) ~[library-module-8.6.0.jar:8.6.0] at org.apache.skywalking.oap.server.library.module.ModuleManager.init(ModuleManager.java:46) ~[library-module-8.6.0.jar:8.6.0] at org.apache.skywalking.oap.server.starter.OAPServerBootstrap.start(OAPServerBootstrap.java:43) [server-bootstrap-8.6.0.jar:8.6.0] at org.apache.skywalking.oap.server.starter.OAPServerStartUp.main(OAPServerStartUp.java:26) [server-starter-8.6.0.jar:8.6.0] 这是我启动 skywalking 的报错,我的配置文件如下:configuration: selector: ${SW_CONFIGURATION:default} default: core: selector: ${SW_CORE:default} default: cluster: selector: ${SW_CLUSTER:standalone} standalone: storage: selector: ${SW_STORAGE:h2} h2: driver: org.h2.jdbcx.JdbcDataSource url: jdbc:h2:mem:skywalking-oap-db user: sa
最新发布
08-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值