什么是JMS?
JMS即java消息服务,JMS通过消息的形式来降低组件之间的耦合度。
JMS由两部分组成消息发送者和消息监听者。
JMS的运用场景?
用户系统负责维护用户信息,文档系统负责维护文档信息,但是当用户删除的时候,需要将他所撰写的文档信息也删除的时候,在用户管理模块调用文档管理模块的接口,会造成用户模块和业务模块紧耦合。
这个时候可以使用JMS技术来将紧耦合转化为松耦合,具体做法是用户系统在删除,修改用户的时候往JMS服务器发送更新消息,又业务系统监听这些消息,然后按照自己的业务逻辑来进行相应的处理。
即组件A做了一件事情往消息服务器上发送了一个通知,组件B监听到了消息,处理自己的业务逻辑。
详细步骤:
1:配置消息服务器:配置JMS需要两个对象connectionFactory和 destination。
connectionFactory使用jboss自带的TopicConnectionFactory。
destination可以使用自定义的。
kiral-jms-service.xml 注意:文件名称一定要是-service.xml结尾。这个文件放在部署目录下。
xml 代码
- <!---->< xml version = "1.0" encoding = "UTF-8" ?>
- < server >
- < mbean code = "org.jboss.mq.server.jmx.Topic"
- name = "jboss.mq.destination:service=Topic,name=kiralJms" >
- < depends optional-attribute-name = "DestinationManager" > jboss.mq:service = DestinationManager depends >
- < depends optional-attribute-name = "SecurityManager" > jboss.mq:service = SecurityManager depends >
- < attribute name = "SecurityConf" >
- < security >
- < role name = "guest" read = "true" write = "true" />
- < role name = "publisher" read = "true" write = "true" create = "false" />
- < role name = "durpublisher" read = "true" write = "true" create = "true" />
- security >
- attribute >
- mbean >
- server >
2:配置发送消息端
bean-jms.xml
xml 代码
- <!---->xml version = "1.0" encoding = "GB2312" ?>
- < beans >
- < bean id = "jmsConnectionFactory"
- class = "org.springframework.jndi.JndiObjectFactoryBean" >
- < property name = "jndiName" >
- < value > TopicConnectionFactory value >
- property >
- bean >
- < bean id = "destination"
- class = "org.springframework.jndi.JndiObjectFactoryBean" >
- < property name = "jndiName" >
- < value > topic/kiralJms value >
- property >
- bean >
- <!---->
- < bean id = "jmsTemplate"
- class = "org.springframework.jms.core.JmsTemplate" >
- < property name = "connectionFactory" >
- < bean
- class = "org.springframework.jms.connection.SingleConnectionFactory" >
- < property name = "targetConnectionFactory"
- ref = "jmsConnectionFactory" />
- bean >
- property >
- bean >
- <!----> <!---->
- < bean id = "messageProducer"
- class = "jms.MessageProducer" >
- < property name = "template" ref = "jmsTemplate" />
- < property name = "destination" ref = "destination" />
- bean >
- beans >
java 代码
- import javax.jms.Destination;
- import javax.jms.JMSException;
- import javax.jms.Message;
- import javax.jms.Session;
- import org.springframework.jms.core.JmsTemplate;
- import org.springframework.jms.core.MessageCreator;
- /***********************************************************
- * 消息发送者
- *
- * @作者:kiral
- * @日期:2007-7-3
- **********************************************************/
- public class MessageProducer {
- public void send( final String message) {
- template.send(destination, new MessageCreator() {
- public Message createMessage(Session session) throws JMSException {
- Message m = session.createTextMessage(message);
- return m;
- }
- });
- }
- private JmsTemplate template;
- private Destination destination;
- public void setDestination(Destination destination) {
- this .destination = destination;
- }
- public void setTemplate(JmsTemplate template) {
- this .template = template;
- }
- }
发送方调用send方法发送消息。
3:配置消息接收者
xml 代码
- <!---->< xml version = "1.0" encoding = "UTF-8" ?>
- <!---->
- < beans >
- < bean id = "jmsConnectionFactory"
- class = "org.springframework.jndi.JndiObjectFactoryBean" >
- < property name = "jndiName" >
- < value > TopicConnectionFactory value >
- property >
- < bean >
- < bean id = "destination"
- class = "org.springframework.jndi.JndiObjectFactoryBean" >
- < property name = "jndiName" >
- < value > topic/kiralJms value >
- property >
- < bean >
- <!---->
- < bean id = "messageListener"
- class = "jms.MessageConsumer" >
- < property name = "worksheetService" ref = "worksheetService" > property >
- < bean >
- <!---->
- < bean id = "listenerContainer"
- class = "org.springframework.jms.listener.DefaultMessageListenerContainer" >
- < property name = "connectionFactory" ref = "jmsConnectionFactory" />
- < property name = "destination" ref = "destination" />
- < property name = "messageListener" ref = "messageListener" />
- < bean >
- < beans >
java 代码
- import javax.jms.Message;
- import javax.jms.MessageListener;
- import org.kiral.flow.service.WorksheetService;
- /*******************************************************************************
- * 消息接收者
- *
- * @作者:kiral
- * @日期:2007-7-3
- ******************************************************************************/
- public class MessageConsumer implements MessageListener {
- private WorksheetService worksheetService;
- public WorksheetService getWorksheetService() {
- return worksheetService;
- }
- public void setWorksheetService(WorksheetService worksheetService) {
- this .worksheetService = worksheetService;
- }
- public void onMessage(Message message) {
- System.out.println(message);
- worksheetService.updateRole();
- }
- }
接受方一旦接收到消息,就会打印在控制台。