使用spring的支持类开发JMS程序可以简化代码,确保开发质量。以下是使用ActiveMQ作为JMS实现的示例。
首先需要确保如下类库,这里使用maven的pom:
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
<
dependency
>
<
groupId
>
org.springframework
</
groupId
>
<
artifactId
>
spring
-
jms
</
artifactId
>
<
version
>
2.5
.
6
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
org.apache.xbean
</
groupId
>
<
artifactId
>
xbean
-
spring
</
artifactId
>
<
version
>
3.5
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
org.apache.activemq
</
groupId
>
<
artifactId
>
activemq
-
core
</
artifactId
>
<
version
>
5.2
.
0
</
version
>
</
dependency
>
编写消息生产者的代码:
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
@Component
public
class
MyMessageProducer { @Resource(name
=
"
Queue
"
)
private
Destination destination; @Autowired
private
JmsTemplate jmsTemplate;
public
void
sendMessage(
final
String message) {
this
.jmsTemplate.send(
this
.destination,
new
MessageCreator() { @Override
public
Message createMessage(Session session)
throws
JMSException { TextMessage textMessage
=
session.createTextMessage(); textMessage.setText(message);
return
textMessage; } }); } }
有关生产者部分spring的配置文件内容:
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
<?
xml version="1.0" encoding="UTF-8"
?>
<
beans
xmlns
="http://www.springframework.org/schema/beans"
xmlns:amq
="http://activemq.apache.org/schema/core"
xmlns:lang
="http://www.springframework.org/schema/lang"
xmlns:context
="http://www.springframework.org/schema/context"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop
="http://www.springframework.org/schema/aop"
xmlns:tx
="http://www.springframework.org/schema/tx"
xmlns:util
="http://www.springframework.org/schema/util"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd"
>
<
context:annotation-config
/>
<
context:component-scan
base-package
="activemq.demo.spring"
/>
<
bean
id
="jmsFactory"
class
="org.apache.activemq.ActiveMQConnectionFactory"
>
<
property
name
="brokerURL"
>
<
value
>
tcp://localhost:61616
</
value
>
</
property
>
</
bean
>
<
bean
id
="myJmsTemplate"
class
="org.springframework.jms.core.JmsTemplate"
>
<
property
name
="connectionFactory"
ref
="jmsFactory"
/>
</
bean
>
<
amq:queue
name
="Queue"
physicalName
="example.D"
/>
这样,执行发送代码,在activemq的admin界面中可以观察到发送成功的消息。
异步接收的代码:
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
public
class
MyMessageConsumer
implements
MessageListener { @Override
public
void
onMessage(Message message) { TextMessage textMessage
=
(TextMessage) message;
try
{ System.out.println(
"
>>>>>>>
"
+
textMessage.getText());
//
throw new RuntimeException(">>>>>>>>>>test error");
}
catch
(JMSException e) {
throw
new
RuntimeException(e); } } }
有关异步接收代码的spring配置:
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
<
bean
id
="myMessageConsumer"
class
="activemq.demo.spring.MyMessageConsumer"
/>
<
bean
id
="jmsContainer"
class
="org.springframework.jms.listener.DefaultMessageListenerContainer"
>
<
property
name
="connectionFactory"
ref
="jmsFactory"
/>
<
property
name
="destination"
ref
="Queue"
/>
<
property
name
="messageListener"
ref
="myMessageConsumer"
/>
<
property
name
="sessionTransacted"
value
="true"
/>
</
bean
>
这样,就实现了基于spring和activemq的JMS的同步发送和异步提交。如果将MyMessageConsumer的抛出异常部分取消注释,则接收信息后,spring捕获到该异常并自动回滚事务。通过activemq的admin界面会监控到消息依然留在队列中。