有很多种技术可以实现系统之间的传递数据
如RPC(远程过程调用的解决方案):COM/DCOM,COBRA,DCE,EJB等等。
也有使用时间通知,内部交互,消息队列的:如FIFO缓冲,消息队列,管道,信号,socket等等
也可以使用异步可靠消息中间件(MOM)。如IBM WEBsphere,apache activeMQ等。也是我们要讨论的。
MOM的设计初衷是为了分布式系统提供异步,解耦,稳定,可扩展的安全的行为。JMS是在MOM供应商所提供的核心API的基础上发展起来的。目标是为java提供一个标准的API来发射和接收消息。同时保证在不同MOM供应商中间的可移植性。JMS不是MOM,而是一个客户端和MOM交互的API。关系类似JDBC和数据库。
JMS中有如下规范
JMS客户端—-100%用Java编写的发送和接收消息的应用。
Non-JMS客户端—-使用JMS提供者特定的客户端API而不是JMS API来发送和接收消息的应用
JMS producer—-创建和发送JMS消息的客户端应用。
JMS consumer—-接收和处理JMS消息的客户端应用。
JMSk可以实现点对点通信。在这种情况下,每条到达队列的消息将会被投递到一个单独的消费者一次。并且只有一次。多个消费者和多个多个生产者都可以注册到同一个队列上。
也可以实现发布订阅模式。生产者发布消息到特定的主题(topics),而订阅该主题的所有人都会受到这一消息。消费者可以选择持久订阅或者非持久订阅。持久订阅的时间是无限的。甚至在订阅者断开连接时,平台仍将保存消息等到重新连接后再投递。除非消费者主动取消订阅。非持久订阅的的时间是有限的。特别是当断开连接时,平台不会保存任何消息。常见的JMS的使用代码如下:
ConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
Connection connection = factory.createConnection();
connection.start();
//创建消息的Destination
Queue queue = new ActiveMQQueue("testQueue");
final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建将要发送的消息
Message message = session.createTextMessage("Hello JMS!");
//创建消息生产者发送消息
MessageProducer producer = session.createProducer(queue);
producer.send(message);
System.out.println("Send Message Completed!");
//创建消息的接收者
MessageConsumer comsumer = session.createConsumer(queue);
//消息的消费者接收消息的第一种方式:手工接受。consumer.receive() 或 consumer.receive(int timeout);
//Message recvMessage = comsumer.receive();
//System.out.println(((TextMessage)recvMessage).getText());
//消息的消费者接收消息的第二种方式:注册一个MessageListener。
comsumer.setMessageListener(new MessageListener(){
public void onMessage(Message msg) {
// TODO Auto-generated method stub
TextMessage textMsg=(TextMessage)msg;
try {
System.out.println(textMsg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
当然,在工程中封装成一个方法要方便的多。
public String getMessage() {
String msg = "";
try {
long timeout = 3000;
Message message = getConsumer(null).receive(timeout);
if (message instanceof TextMessage) {
TextMessage txtMsg = (TextMessage) message;
msg = txtMsg.getText();
}
} catch (JMSException e) {
logger.error(e.getMessage(), e);
}
return msg;
}
创建一个连接要指定若干属性
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();
public AmqConsumerTool(String brokerUrl, String queueName, String userName, String password,String filter) {
this.brokerUrl = brokerUrl;
this.queueName = queueName;
cf.setBrokerURL(this.brokerUrl);
cf.setUserName(userName);
cf.setPassword(password);
try {
getConnection().start();
getConsumer(null,filter);
} catch (JMSException e) {
logger.error(e.getMessage(), e);
}
}