251
Q: #17.2.2-1 | Spring的JmsTemplate会捕获标准的JMSException异常,再以Spring的非检查型异常JmsException子类重新抛出。
A:
左侧是Spring(org.springframework.jms.*), 右侧是标准的JMS(javax.jms.*)
* DestinationResolutionException --- Spring特有的——当Spring无法解析目的地名称时抛出
* IllegalStateException --- IllegalStateException
* InvalidClientIDException --- InvalidClientIDException
* InvalidDestinationException --- InvalidSelectorException
* InvalidSelectorException --- InvalidSelectorException
* JmsSecurityException --- JmsSecurityException
* ListenerExecutionFailedException --- Spring特有的——当监听器方法执行失败时抛出
* MessageConversionException --- Spring特有的——当消息转换失败时抛出
* MessageEOFException --- MessageEOFException
* MessageFormatException --- MessageFormatException
* MessageNotReadableException --- MessageNotReadableException
* MessageNotWriteableException --- MessageNotWriteableException
* ResourceAllocationException --- ResourceAllocationException
* SynchedLocalTransactionFailedException --- Spring特有的——当同步的本地事务不能完成时抛出
* TransactionInprogressException --- TransactionInprogressException
* TransactionRolledBackException --- TransactionRolledBackException
* UncategorizedJmsException --- Spring特有的——当没有其他异常适用时抛出
252
Q: #17.2.2-2 | 为了使用JmsTemplate,我们需要在Spring的配置文件中将它声明为一个bean。如下的XML可以完成这项工作:
A:
<bean id="jmsTemplate"
class="org.springframework.jms.core.JmsTemplate"
c:_-ref="connectionFactory" />
253
Q: #17.2.2-3 | JmsTemplate代表发送者来负责处理发送消息的复杂过程,图示
A:
254
Q: #17.2.2-4 | 与其每次发送消息时都指定一个目的地,不如我们为JmsTemplate装配一个默认的目的地。
A:
<bean id="jmsTemplate"
class="org.springframework.jms.core.JmsTemplate"
c:_-ref="connectionFactory"
p:defaultDestinationName="spittle.alert.queue" />
255
Q: #17.2.2-5 | MessageConverter是Spring定义的接口,只有两个需要实现的方法
A:
public interface MessageConverter {
Message toMessage(Object object, Session session)
throws JMSException, MessageConversionException;
Object fromMessage(Message message)
throws JMSException, MessageConversionException;
}
256
Q: #17.2.2-6 | Spring为通用的转换任务提供了多个消息转换器,(所有的消息转换器都位于org.springframework.jms.support.converter包中)
A:
257
Q: #17.2.2-7 | 如果你想使用JSON消息的话,那么可以声明一个MappingJacksonMessageConverter bean
A:
<bean id="messageConverter"
class="org.springframework.jms.support.converter.MappingJacksonMessageConverter" />
258
Q: #17.2.2-8 | 使用JmsTemplate接收消息
A:
public Splittle receiveSplittleAlert(){
try{
ObjectMessage receiveMessage = (ObjectMessage) jmsOperations.reveive(); //接收消息
return (Splittle) reveiveMessage.getObject(); //获得对象
} catch (JMSException jmsException) {
throw JmsUtils.convertJmsAccessException(jmsException); //抛出转换后的异常
}
}
使用JmsTemplate从主题或队列中接收消息的时候,只需要简单地调用receive()方法。JmsTemplate会处理其他的事情。
259
Q: #17.2.3-1 | Spring MDP异步接收和处理消息
A:
package com.habuma.spittr.alerts;
import com.habuma.spittr.domain.Spittle;
public class SplittleAlertHandler {
public void handleSpittleAlert(Spittle spittle){
// implemention goes here...
}
}
260
Q: #17.2.3-2 | 消息监听器容器,是什么?
A: 消息监听器容器(message listener container)是一个特殊的bean,它可以监控JMS目的地并等待消息到达。一旦有消息到达,它取出消息,然后把消息传给任意一个对此消息感兴趣的消息监听器。如图17.7展示了这个交互过程。
消息监听器容器监听队列和主题。当消息到达时,消息将转给消息监听器(例如消息驱动的POJO)。