MessageConsumer

MessageConsumer

MessageConsumer是一个由Session创建的对象,用来从Destination接收消息。MessageConsumer createConsumer(Destination destination);

MessageConsumer createConsumer(Destination destination, String messageSelector);

MessageConsumer createConsumer(Destination destination, String messageSelector, boolean noLocal);

TopicSubscriber createDurableSubscriber(Topic topic, String name);

TopicSubscriber createDurableSubscriber(Topic topic, String name, String messageSelector, boolean noLocal);

其中messageSelector为消息选择器; noLocal标志默认为false,当设置为true时限制消费者只能接收和自己相同的连接(Connection)所发布的消息,此标志只适用于主题,不适用于队列; name标识订阅主题所对应的订阅名称,持久订阅时需要设置此参数。

public final String SELECTOR =“JMS_TYPE=‘MY_TAG1’”;该选择器检查了传入消息的JMS_TYPE属性,并确定了这个属性的值是否等于MY_TAG1。如果相等,则消息被消费;如果不相等,那么消息会被忽略。

public class producer {

//单例模式

//1连按工厂

private connectionFactory connectionractory ;

//2连接对象

private connection connection;

//3session对象

private session session;

//生产者

private MessageProducer messageProcpublic Producer() {

try {

this.connectionFactory = new ActiveMoconnectionFactory(

//ActiveMgconnectionFactory . DEPAULT_USER,

//ActiveMgconnectionFactory . DEPA0LT PAsswORD,

‘’bhz”,”bhz’”

"tep: / /1ocalhost: 61616");

this.connection = this.connectionractory.createconnection();

this.connection.start();

//非事务自动签收

this.session=this.connection.createSession(Boolean.FALSE,Session.AUT0_ACKNVOWIEEDGE);

this.messageProducer = this.session.createProducer(null);

) catch (JMSException e){

e. printstackTrace();

}

public session getsession(){

return this.session;

}

pub1ic vold send1 (/*String QueueName, Message message*/) {

try {

Destination destination = this. session. creategueue ("first");

MapMessage msg1 = this . session. crea teMapMessage() ;

msg1. setstring("name",“张三");

msg1. setstring("age", "23");

//标红部分是messageSelector能获取到的属性

msg1. setstringProperty ("color", "bIue");

msg1. setIn tProperty("sal", 2200);

MapMessage msg2 = this . session. crea teMapMessage() ;

msg2. setstring("name", "李四");

msg2. setstring("age", "26");

msg2. setstringProperty ("color", "red") ;

msg2. setIn tProperty("sal", 1300) ;

MapMessage msg3 = this. session. crea teMapMessage() ;

msg3. setString("name", "王五");

msg3. setstring("age", "28") ;

msg3. setstringProperty("color", "green");

msg3. setIn tProperty("sal", 1500) ;

MapMessage msg4 = this. session. crea teMapMessage() ;

msg4. setstring("name", "赵六");

msg4. setstring("age", "30");

msg4. setstringProperty ("color", "blue");

msg4. setIntProperty("sal", 1800) ;

}catch (JMSException e){

e.printstackTrace () ;

}

}

public void send2(/*string QueueName,Message message*/){

try {

Destination destination = this.session.createQueue ("first");

TextMessage msg = this.session.createTextMessage(”我是一个字符串内容");

this.messageProducer.send(destination,msg,DeliveryMode.NON_PERSTSTENT,9,1000*60*10L) ;

}catch (JMSException e){

e.printstackTrace () ;

}

}

public static void main (string[]args) {

Producer p = new Producer();

p.send1();

//p.senc2();

}

}

public class Consumer {

public final string SELECTOR 1 = "color = 'blue'";

//"JMSType = 'car' AND weight > 2500") ;

public final string SELECTOR 2 = "color = 'blue' AND sal > 2000";

public final String SELECTOR 3 = "receiver = 'A'";

//public final string SELECTOR 4 = "receiver = 'B!";

// 1连接工厂

private ConnectionFactory connectionFactory ;

// 2连接对象

private Connection connection;

// 3 session对象

private Session session;

//4消费者

private MessageConsumer messageConsumer;

// 5目标地址

private Destination des tination;

public Consumer () {

this . connectionFactory = new ActiveMQConnectionFactory (

"bhz", //ActiveMQConnectionFac tory. DEFAULT USER,

"bhz",//ActiveMQConnectionFactory. DEFAULT PASSWORD,

"tcp://localhost: 61616");

this. connection = this. connectionFactory. createConnection () ;

this . connection.start() ;

this.session = this. connection. createsession (Boolean . False, Session . AUTO ACKNOWLEDGE) ;

this. destination = this. session. createQueue ("first");

this . messageConsumer = this . sesslon . createConsumer (this . des tination, SELECTOR 3) ;

} catch (JMSException e) {

e.printstackTrace () ;

}

pub1ic void receiver() {

try {

this . messageConsumer . setMessageListener (new Listener ());

} catch (JMSException e) {

e.printstackTrace() ;

)

}

class Listener implements MessageLi stener {

@override

public void onMessage (Message message) {

try {

if (message instanceof TextMessage) {

}

if (message instanceof MapMessage) {

MapMessage ret = (MapMessage) message;

sys tem. out . println (ret. tostring());

Sys tem. out. printIn (ret. ge tstring ("name"));

System. out.printIn (ret. getstring("age"));

}

} catch

(JMSException e) {

e .printstackTrace();

}

I

}

}

public static void main (string[]args) {

Consumer c = new Consumer ();

c.receiver();

}

}

消息的同步和异步接收:

消息的同步接收是指客户端主动去接收消息,客户端可以采用MessageConsumer的receive方法去接收下一个消息。

Message receive()

Message receive(long timeout)

Message receiveNoWait()

消息的异步接收是指当消息到达时,ActiveMQ主动通知客户端,可以通过注册一个实现MessageListener接口的对象到MessageConsumer。 MessageListener只有一个必须实现的方法—— onMessage,它只接收一个参数,即Message。在为每个发送到Destination的消息实现onMessage时,将调用该方法。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中实现Redis消息队列可以使用Redis的Java客户端库,比如Jedis或Lettuce。下面是一个简单的示例代码: 1. 首先,确保已经安装了Redis并启动了Redis服务器。 2. 添加Redis Java客户端库的依赖到你的项目中。如果使用Maven,可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.6.1</version> </dependency> ``` 3. 创建一个生产者类,用于将消息发送到Redis队列: ```java import redis.clients.jedis.Jedis; public class MessageProducer { private final Jedis jedis; public MessageProducer() { jedis = new Jedis("localhost"); // 连接到本地的Redis服务器 } public void sendMessage(String queueName, String message) { jedis.lpush(queueName, message); // 将消息推送到队列的左侧 } } ``` 4. 创建一个消费者类,用于从Redis队列中接收消息: ```java import redis.clients.jedis.Jedis; public class MessageConsumer { private final Jedis jedis; private final String queueName; public MessageConsumer(String queueName) { jedis = new Jedis("localhost"); // 连接到本地的Redis服务器 this.queueName = queueName; } public String receiveMessage() { // 从队列的右侧弹出一条消息 return jedis.rpop(queueName); } } ``` 5. 在应用程序中使用生产者和消费者类发送和接收消息: ```java public class Main { public static void main(String[] args) { MessageProducer producer = new MessageProducer(); MessageConsumer consumer = new MessageConsumer("myQueue"); // 发送消息到队列 producer.sendMessage("myQueue", "Hello, Redis!"); // 从队列中接收消息 String message = consumer.receiveMessage(); System.out.println("Received message: " + message); } } ``` 上述代码中,生产者使用`jedis.lpush(queueName, message)`将消息推送到队列的左侧,消费者使用`jedis.rpop(queueName)`从队列的右侧弹出一条消息。 这是一个简单的示例,你可以根据实际需求进行更复杂的消息处理和线程管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA代码搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值