`
y806839048
  • 浏览: 1127767 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

jms双系统应用

    博客分类:
  • jms
阅读更多
==============发送方配置(与接受方配置差别在于不要配置服务器)=======
http://hellohank.iteye.com/blog/1341290
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:amq="http://activemq.org/config/1.0"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

  http://activemq.org/config/1.0 http://activemq.apache.org/schema/core/activemq-core-5.0.0.xsd">

       <!-- 配置ActiveMQ服务 -->

       <amq:broker useJmx="false" persistent="false">

              <amq:transportConnectors>

                     <!-- 提供的连接方式有:VM Transport、TCP Transport、SSL Transport、

                            Peer Transport、UDP Transport、Multicast Transport、HTTP and HTTPS Transport、

                            Failover Transport、Fanout Transport、Discovery Transport、ZeroConf Transport等 -->

                     <amq:transportConnector uri="tcp://127.0.0.1:61616" />

              </amq:transportConnectors>

       </amq:broker>

       <!-- 配置JMS连接工厂(注:brokerURL是关键,

它应该是上面的amq:transportConnectors里面的值之一) -->

       <amq:connectionFactory id="jmsConnectionFactory"

              brokerURL="tcp://127.0.0.1:61616" />

       <!-- 消息发送的目的地(注:amq:queue是用于指定是发送topic不是queue,对应上面配置中的amq:destinations) -->

       <amq:queue name="destination" physicalName="ossQueue" />

       <!-- 创建JMS的Session生成类 -->

       <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>

              <!-- 指定发送信息时使用的消息转换类.

                     这个选项不填的话,默认的是:SimpleMessageConverter,它只支持4种类型的对象:String, byte[],Map,Serializable

              -->

              <!--  如果加上下面这段配置就会出错, 错误原因是Book不是一个原始类, 但我已经将它继承Serializable了,可还是不行, 我想可能有其他什么原因吧, 但我现在不清楚 -->

              <!-- <property name="messageConverter"

                     ref="resourceMessageConverter" /> -->

       </bean>

       <!-- 发送消息的转换类

(这个类要继承org.springframework.jms.support.converter.MessageConverter) -->

       <bean id="resourceMessageConverter"

              class="com.focustech.jms.ResourceMessageConverter" />

       <!-- 消息生产者(通过指定目的地, 就可以同时指定其发送的消息模式是topic还是queue) -->

       <bean id="resourceMessageProducer"

              class="com.focustech.jms.ResourceMessageProducer">

              <property name="template" ref="jmsTemplate" />

              <property name="destination" ref="destination" />

       </bean>

       <!-- 消息接收类(这个类需要继承,当然也可以通过MessageListenerAdapter指定消息转换器来实现用户自定义的消息收发) -->

       <bean id="resourceMessageListener"

              class="org.springframework.jms.listener.adapter.MessageListenerAdapter">

              <constructor-arg>

                     <bean

                            class="com.focustech.jms.ResourceMessageConsumer">

                     </bean>

              </constructor-arg>

              <property name="defaultListenerMethod" value="recieve" />

              <!-- 自定义接收类与接收的方法 -->

              <property name="messageConverter"

                     ref="resourceMessageConverter" />

       </bean>

       <!-- 消息监听容器,其各属性的意义为:

              connectionFactory:指定所监听的对象,在这里就是监听连接到tcp://127.0.0.1:61616上面的ActiveMQ;

              destination:监听的消息模式;

              messageListener:接收者

       -->

       <bean id="listenerContainer"

              class="org.springframework.jms.listener.DefaultMessageListenerContainer">

              <property name="connectionFactory" ref="jmsConnectionFactory" />

              <property name="destination" ref="destination" />

              <property name="messageListener" ref="resourceMessageListener" />

       </bean>

</beans>




===========接收方配置============



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:amq="http://activemq.org/config/1.0"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

  http://activemq.org/config/1.0 http://activemq.apache.org/schema/core/activemq-core-5.0.0.xsd">

      

       <!-- 配置JMS连接工厂(注:brokerURL是关键,

它应该是上面的amq:transportConnectors里面的值之一) -->

       <amq:connectionFactory id="jmsConnectionFactory"

              brokerURL="tcp://127.0.0.1:61616" />

       <!-- 消息发送的目的地(注:amq:queue是用于指定是发送topic不是queue,对应上面配置中的amq:destinations) -->

       <amq:queue name="destination" physicalName="ossQueue" />

       <!-- 创建JMS的Session生成类 -->

       <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>

              <!-- 指定发送信息时使用的消息转换类.

                     这个选项不填的话,默认的是:SimpleMessageConverter,它只支持4种类型的对象:String, byte[],Map,Serializable

              -->

              <!--  如果加上下面这段配置就会出错, 错误原因是Book不是一个原始类, 但我已经将它继承Serializable了,可还是不行, 我想可能有其他什么原因吧, 但我现在不清楚 -->

              <!-- <property name="messageConverter"

                     ref="resourceMessageConverter" /> -->

       </bean>

       <!-- 发送消息的转换类

(这个类要继承org.springframework.jms.support.converter.MessageConverter) -->

       <bean id="resourceMessageConverter"

              class="com.focustech.jms.ResourceMessageConverterb" />

       <!-- 消息生产者(通过指定目的地, 就可以同时指定其发送的消息模式是topic还是queue) -->

       <bean id="resourceMessageProducer"

              class="com.focustech.jms.ResourceMessageProducerb">

              <property name="template" ref="jmsTemplate" />

              <property name="destination" ref="destination" />

       </bean>

       <!-- 消息接收类(这个类需要继承,当然也可以通过MessageListenerAdapter指定消息转换器来实现用户自定义的消息收发) -->

       <bean id="resourceMessageListener"

              class="org.springframework.jms.listener.adapter.MessageListenerAdapter">

              <constructor-arg>

                     <bean

                            class="com.focustech.jms.ResourceMessageConsumerb">

                     </bean>

              </constructor-arg>

              <property name="defaultListenerMethod" value="recieve" />

              <!-- 自定义接收类与接收的方法 -->

              <property name="messageConverter"

                     ref="resourceMessageConverter" />

       </bean>

       <!-- 消息监听容器,其各属性的意义为:

              connectionFactory:指定所监听的对象,在这里就是监听连接到tcp://127.0.0.1:61616上面的ActiveMQ;

              destination:监听的消息模式;

              messageListener:接收者

       -->

       <bean id="listenerContainer"

              class="org.springframework.jms.listener.DefaultMessageListenerContainer">

              <property name="connectionFactory" ref="jmsConnectionFactory" />

              <property name="destination" ref="destination" />

              <property name="messageListener" ref="resourceMessageListener" />

       </bean>

</beans>




==========web.xml=====
<!-- spring配置 -->
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>development</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml,classpath*:*.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>




=====java===
package com.focustech.jms;

import java.io.Serializable;

public class Book implements Serializable

{

       /**

        *

        */

       private static final long       serialVersionUID   = -6988445616774288928L;

       long                                    id;

       String                                 name;

       String                                 author;

       public String getAuthor()

       {

              return author;

       }

       public void setAuthor(String author)

       {

              this.author = author;

       }

       public long getId()

       {

              return id;

       }

       public void setId(long id)

       {

              this.id = id;

       }

       public String getName()

       {

              return name;

       }

       public void setName(String name)

       {

              this.name = name;

       }

}




package com.focustech.jms;

public class ResourceMessageConsumer

{

       public void recieve(Object obj)

       {

              Book book = (Book) obj;

              System.out.println("============qqqqq===========================");

              System.out.println("receiveing message qqqq...");

              System.out.println(book.toString());

              System.out.println("here to invoke our business methodqqqq...");

              System.out.println("====================qqq===================");

       }

}




package com.focustech.jms;

import java.awt.print.Book;
import java.util.HashMap;
import java.util.Map;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;

import org.apache.activemq.command.ActiveMQObjectMessage;
import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.jms.support.converter.MessageConverter;

public class ResourceMessageConverter implements MessageConverter

{

       @SuppressWarnings("unchecked")

       public Message toMessage(Object obj, Session session) throws JMSException, MessageConversionException

       {

              // check Type

              if (obj instanceof Book)

              {

                     // 采用ActiveMQ的方式传递消息

                     ActiveMQObjectMessage objMsg = (ActiveMQObjectMessage) session.createObjectMessage();

                     Map map = new HashMap();

                     map.put("Book", obj);

                     // objMsg.setObjectProperty里面放置的类型只能是:String, Map, Object, List

                     objMsg.setObjectProperty("book", map);

                     return objMsg;

              }

              else

              {

                     throw new JMSException("Object:[" + obj + "] is not Book");

              }

       }

       public Object fromMessage(Message msg) throws JMSException, MessageConversionException

       {

              if (msg instanceof ObjectMessage)

              {

                     Object obj = ((ObjectMessage) msg).getObject();

                     return obj;

              }

              else

              {

                     throw new JMSException("Msg:[" + msg + "] is not Map");

              }

       }

}



package com.focustech.jms;



import javax.jms.Destination;

import org.springframework.jms.JmsException;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class ResourceMessageProducer

{

       private JmsTemplate    template;

       private Destination      destination;

       public JmsTemplate getTemplate()

       {

              return template;

       }

       public void setTemplate(JmsTemplate template)

       {

              this.template = template;

       }

       public Destination getDestination()

       {

              return destination;

       }

       public void setDestination(Destination destination)

       {

              this.destination = destination;

       }

       public void send(Book book)

       {

              System.out.println("=======================================");

              System.out.println("do send ......");

              long l1 = System.currentTimeMillis();

              template.convertAndSend(this.destination, book);

              System.out.println("send time:" + (System.currentTimeMillis() - l1) / 1000 + "s");

              System.out.println("=======================================");



       }

}


==jsp==
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %>
       <%@ page import="org.springframework.web.context.WebApplicationContext" %>
          <%@ page import="org.springframework.jms.JmsException" %>
             <%@ page import="com.focustech.jms.Book" %>
                <%@ page import="com.focustech.jms.ResourceMessageProducer" %>
                   <%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %>
    <%
    try {

         ServletContext servletContext = this.getServletContext();

         WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);

    ResourceMessageProducer resourceMessageProducer = (ResourceMessageProducer) wac.getBean("resourceMessageProducer");

    Book book = new Book();

    book.setId(123);

    book.setName("jms test!");

    book.setAuthor("taofucheng");

    resourceMessageProducer.send(book);

          } catch (JmsException e) {

      }
    %>
   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>






集成事务

Spring提供的JMS的API中已经有了集成事务的功能,我们只要将上面监听容器的配置改成下面的就行了:

首先,将jmsTemplate设置成支持事务(它默认是不支持事务的):

       <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>

              <property name="sessionTransacted" value="true"/>

       </bean>

然后再在消息监听容器中设置指定的事务管理:

    <bean id="listenerContainer"

              class="org.springframework.jms.listener.DefaultMessageListenerContainer">

              <property name="connectionFactory" ref="jmsConnectionFactory" />

              <property name="destination" ref="destination" />

              <property name="messageListener" ref="resourceMessageListener" />

              <!—jtaTransactionManager是系统中的事务管理类,在我们的系统中,是由Spring托管的 -->

              <property name="transactionManager" ref="jtaTransactionManager" />

       </bean>

这样配置之后,当事务发生回滚时,消息也会有回滚,即不发送出去。

4、其它高级应用

ActiveMQ还有许多其它高级的应用,如:自动重连机制,也就是保证当通信双方或多方的链接断裂后它会根据用户的设置自动连接,以保证建立可靠的传输;另外,ActiveMQ还有其它方式嵌入到Spring中,如它可以通过xbean, file等方式建立应用;它还可以通过JMX对消息的发送与接收进行实时查看;消息的确认方式等等,还有很多高级的应用,请参考
分享到:
评论

相关推荐

    PDS-17001_JMS583_Datasheet_(Rev._1.0)_JMS583_jmicron_jms583开发_

    总结来说,JMS583芯片是现代高速存储解决方案的重要组成部分,它利用先进的USB 3.1 Gen 2和PCIe Gen3x2技术,为存储设备提供高速、低延迟的数据传输,广泛应用于各种存储设备的开发中,对于提升系统性能和用户体验...

    Flex + BlazeDS + Java + JMS 通信实例(附源码)

    JMS(Java Message Service)是Java平台中用于企业级消息传递的标准API,它提供了异步通信的能力,使得不同系统间可以可靠地交换消息。 本实例重点探讨了如何使用Flex作为前端,通过BlazeDS与Java后台结合JMS服务...

    JMS金山快译2005

    在这里,"JMS金山快译"可能是指软件采用了JMS技术来处理后台服务,如翻译任务的调度和处理,使得软件能够高效地处理大量翻译请求,同时保持系统的稳定性和可扩展性。 在这款软件中,主要包含以下几个核心知识点: ...

    一种基于JMS的实时推送技术.pdf

    本文提出了一种创新性的实时推送方法,它基于消息总线,利用JMS(Java消息服务)和DWR(Direct Web Remoting)框架实现模块间的数据实时传输,适用于高性能Web应用和开发。 【正文】: 在互联网的快速发展中,实时...

    基于JMS的分布式数据同步.pdf

    标题提及的“基于JMS的分布式数据同步”是一种在分布式系统中解决数据一致性问题的技术方案。JMS(Java Message Service)是Java平台上的标准消息中间件接口,用于在分布式环境中传递消息,从而实现不同组件之间的...

    应用服务器中间件技术要求.doc

    8. **JMS服务**:内置JMS服务,兼容第三方消息中间件,提供消息服务代理。 9. **Web Service支持**:支持Web Service端点的访问和创建,便于服务的发布和消费。 10. **JCA支持**:资源适配器的集成使得服务器能...

    JavaEE程序设计与应用开发源代码.rar

    6. **JMS(Java Message Service)**:JMS允许应用程序通过消息传递方式进行异步通信。它支持点对点和发布/订阅两种模式,适用于解耦系统组件间的通信。 7. **JNDI(Java Naming and Directory Interface)**:JNDI...

    JAVA网络通信系统的研究与开发,java远程通信及应用的研究,Java源码.zip

    在Java编程语言中,网络通信是一项关键技能,尤其在构建分布式系统、服务器应用程序以及客户端-服务器应用时。本文将深入探讨“JAVA网络通信系统的研究与开发”和“java远程通信及应用的研究”,并结合提供的Java...

    郭克华JavaEE程序设计与应用开发PPT

    8. **JMS(Java Message Service)**:JMS允许Java应用程序创建、发送、接收和读取消息,支持点对点和发布/订阅两种模式,是实现异步通信的关键。 9. **WebSocket**:在JavaEE 7中引入,WebSocket提供了双向通信的...

    2021年自考互联网软件应用与开发试卷及答案解释完整版.docx

    - **JMS(Java Message Service)**:Java消息服务,提供了面向消息中间件的API,用于在两个应用程序之间,或者分布式系统中的组件之间进行基于消息的通信。 - **JTA(Java Transaction API)**:Java事务API,用于...

    张孝祥在sd2c大会上的JavaWeb高级应用讲课ppt

    5. **JMS(Java Message Service)**:JMS允许应用程序之间通过消息传递进行异步通信,常用于解耦系统组件,提高系统的可伸缩性和可靠性。 6. **JPA(Java Persistence API)**与**Hibernate**:JPA是JavaEE规范的...

    经典Java EE企业应用开发实战codes15

    - 用于发送和接收电子邮件,常用于企业级应用中的通知系统。 8. **Java WebSocket API** - 支持双向通信的协议,允许服务器和客户端实时交换数据,适用于实时应用。 9. **Java API for RESTful Web Services ...

    分布式JAVA应用 基础与实践

    3. JMS(Java Message Service):Java消息服务,用于在分布式系统中传递异步消息,实现解耦和异步处理。 二、Java网络编程 1. Socket编程:Java的Socket类提供了基于TCP/IP的网络通信能力,可用于创建可靠的、双向...

    XML在J2EE中的应用.doc

    在实际应用中,如上述媒体管理系统的示例,XML文档描述了媒体资产的元数据,包括名称、描述、类型和统一资源名称(URN)。这种结构化的数据表示使得系统能够轻松地管理和检索内容。当数据需要在Java对象和XML文档...

    这是使用java ee ,tomcat,jsp,Oracle 开发的毕业设计双向选题系统.zip

    Oracle数据库是全球广泛使用的商业关系型数据库管理系统,尤其适合大型企业级应用。在这个选题系统中,Oracle可能存储了教师信息、学生信息、课题数据以及选题状态等关键信息。开发者可能会使用JDBC(Java Database ...

    JAVA项目_JAVAEE开发双十二天猫购物系统.rar

    总结来说,"JAVA项目_JAVAEE开发双十二天猫购物系统"是一个全面展示JAVAEE技术应用的实例,涵盖了从Web开发、数据库设计到分布式系统架构的诸多方面。通过深入研究这个项目,开发者可以提升在大型电商项目中的实战...

Global site tag (gtag.js) - Google Analytics