一、代码实现
要实现ActiveMQ的请求和应答模式,需要3部分组成:ActiveMQ消息总线、Client端(消息的发送者)、Server端(消息的接收者)
1、ActiveMQ消息总线
变量:
activemqBusAddress:消息总线部署的IP地址
activemqUsername:与消息总线建立连接需要的用户名
activemqPassword:与消息总线建立连接需要的用户密码
componentId:每个Client需要有唯一的componentId作为标示
connection:连接信息,类型Connection
session:为每一个连接创建session,用于存储消息信息,类型Session
方法:
initActiveMQ():初始化ActiveMQ,建立连接
destroy():销毁ActiveMQ,释放内存
2、Client(消息的producer)
1)两个队列:
ActiveMQQueue requestQueue = new ActiveMQQueue(RequestQueue);//用于消息发送的队列,RequestQueue为一个字符串,表示队列名字(同一类型的消息需要使用同一个请求队列)
ActiveMQQueue responseQueue = new ActiveMQQueue(ResponseQueue);//用于接收响应的队列,ResponseQueue为一个字符串,表示队列名字(不同的Client应用不同的队列名字标识)
2)消息发送
MessageProducer producer1 = activeMQBus.getProducer(requestQueue);//定义消息发送者
Message textMessage1 = activeMQBus.createTextMessage("消息内容");//设置消息内容
textMessage1.setJMSReplyTo(responseQueue);//指定响应返回的队列
textMessage1.setJMSCorrelationID(activeMQBus.getComponentId());//设置ClientID
producer1.send(textMessage1);//发送消息
3)响应接收
MessageConsumer consumer = activeMQBus.getConsumer(responseQueue);//定义响应接受者
consumer.setMessageListener(new MessageListener(){//设置监听等待响应
@Override
public void onMessage(final Message message) {
// TODO Auto-generated method stub
try {
message.acknowledge();//接收响应
String request = ((TextMessage) message).getText();//获得响应内容
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3、Server(消息的Consumer)
1)一个队列:
MessageConsumer consumer = activeMQBus.getConsumer(requestQueue);//用于接收消息的队列,RequestQueue为一个字符串,表示队列名字(RequestQueue应于消息发送的队列名相同)
2)消息接收
consumer.setMessageListener(new MessageListener(){//设置消息接收监听
@Override
public void onMessage(final Message message) {
// TODO Auto-generated method stub
try {
message.acknowledge();//接收消息
String request = ((TextMessage) message).getText();//获得消息内容
//3)发送响应
TextMessage response = (TextMessage) activeMQBus.createTextMessage("响应的文本内容");//设置响应的内容
MessageProducer producer = activeMQBus.getProducer(message.getJMSReplyTo());//根据请求的队列设置响应的发送者
producer.send(response);//发送响应
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
二、测试结果
1、 Client的每一条消息都会随机的被某一个Server接收,并未发生重复接收或遗漏的现象。
2、 Server端在成功接收消息后,会将响应信息返回给发送消息的相应Client上。