2、目前流行的消息传送产品有哪些?
答:目前流行的有ActiveMQ、IBM WebSphere MQ、SonicMQ等。3、什么时候可以用到java消息机制?
答:(1)异构系统集成,整合现有资源,提高资源的利用率;
(2)异步请求处理,减轻或消除系统瓶颈,提高用户生产率和系统的整体可伸缩性;
(3)组件解偶,增加系统的灵活性
客户端通过队列(queue)这个虚拟通道来同步和异步发送、接收消息,发送到队列的消息只能被一个接收者所接收,即使有多个消费者时也只能有一个消费者处理消息
JMS API可以分为3个主要部分:公共API、点对点API和发布/订阅API。
在JMS1.1中,公共API可被用于向一个队列或一个主题发送消息,或从其中接收消息。点对点API专门用于使用队列的消息传送,而发布/订阅API则专门用于使用主题的消息传送。
在JMS公共API内部,和发送和接收JMS消息有关的JMS API接口主要有7个:6、java消息分为哪些部分?
消息头、消息属性、消息自身;7、消息过滤
消息订阅者需要对消息进行过滤,否则订阅者就会接受到主题或队列的每一条消息,浪费了不必要的资源(CPU、内存等),而使用消息过滤技术,能让订阅者只接受它需要的消息。(消息过滤对于队列消费尤其重要,因为一个队列消费者消费消息后其他消费者就不再可用,此时如果不对消息进行过滤处理,这条消息就很可能被浪费掉)。 TextMessage textMessage = Session.createTextMessage();
textMessage.setText(“mytestMsg”);
textMessage.setStringProperty(“city”,”hangzhou”);
textMessage.setStringProperty(“company”,”mycompany”);
这条消息中设置的消息属性名“city”和“company”代表消息选择器的标识符,”hangzhou”和”mycompany”代表常量
在消费端创建一个选择器: String selector = “city = 'hangzhou' AND company='mycompany'”;
QueueReceiver qReceiver = qSession.createReceiver(testQ,selector);
其中“=”和“AND”为比较运算符,其他常用比较运算符还有:
like运算符、BETWEEN运算符、IN运算符、IS NULL运算符等
8.1 、 AUTO_ACKNOWLEDGE
从消息生产者角度:发送消息后就开始阻塞,直到从消息服务器收到回复,期间如发生异常则认为消息未被传送8.2 、 CLIENT_ACKNOWLEDGE
消费者可在处理完业务逻辑后在代码重显示调用 message.acknowledge() 通知 jms 提供者已成功接收道消息
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
持久化消息和持久订阅者在服务器和消费者端之间的消息传送保证机制比较类似,但在有一种情况下他们还是存在区别的,对持久订阅者来说,当消息服务器向发送者发送确认消息之后,并为当前未运行的持久订阅者将消息保存到介质之间如果发送故障,该消息就会丢失,而持久化消息则是先保存消息道介质,然后才向发送者发送确认消息,所以不存在这个问题,因此严格来说持久化消息的可靠性会更高。
9 、事务性消息
jms 事务性保证了一组发送的消息或接收的消息要么全部成功要么全部失败,概念上和我们在java 中使用的jta 相似,但jms 事务是由jms 提供者来管理的,而不是jta 。使用方法如下:
// 此处用true ,表示使用事务性消息
Session session =connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// 用来发送的3 个消息
MessageProducer sender = session.createProducer(“queue/testQueue”);
try{
TextMessage message1 = session.createTextMessage(“ 要发送的消息1”);
sender.send(message);
TextMessage message2 = session.createTextMessage(“ 要发送的消息2”);
sender.send(message);
TextMessage message3 = session.createTextMessage(“ 要发送的消息3”);
sender.send(message);
session.commit();
}catch(Exception e){
try{
session.rollback();
}catch(JMSException e){
}
}