`
gongmingwind
  • 浏览: 588274 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

基于多种协议的消息传递机制简介(转)

阅读更多
转载  基于多种协议的消息传递机制简介(转) 收藏

目前,很常用的传输数据协议有http、https、ftp、rmi、soap、tcp、ejb、jms、file等等。基于soa架构思想的企业架构框架的传输协议目前使用的比较多的是jms、ejb、web service等主要几种的协议。下面主要列出以上三种的协议的分析:

l  Jms协议:


JMS 是用于构建企业消息传递应用程序的标准的 J2EE 消息传递 API。JMS 规范提供了抽象的、独立于提供者的消息传递接口,这样一来,可以使用通用 API 编写消息传递应用程序,而不用担心基础消息传递的实现。JMS 提供了两种通用的消息传递模式,用于构建消息传递应用程序:点到点模式和发布/订阅 (pub/sub) 模式。JMS 应用程序向 JMS 目标发送消息,而这些目标可能是队列(在点到点域中)和主题(在发布/订阅域中)。

使用 JMS 作为消息传递接口的优点包括:

因为它们按照标准的 API 编写,所以应用程序在不同的 JMS 提供者之间具有可移植性,并且您可以将应用程序迁移到任何其他的 JMS 提供者。
程序员可以使用通用的 API 编写程序,从而避开具体的基础实现,这就意味着程序员可以构建通用的技巧,而不再需要深入地研究特定产品的相关知识

  一提到jms,大家应该都知道jms1.1规范。这是在2004年sun公司推出的。距离至今已有一段时间。它的应用在业界应用十分广泛,也是目前乃至未来的主要核心以及主流的技术。

目前,很成熟的开源项目ActiveMQ3.0已经很优秀了,不管从它的jms1.1规范支持程度和它的全面的策略支持已经不同类型的消息的数据持久化和强大且稳定的传输通信等等。目前,业界,还有jbossmq等等。

Jms主要包括主题[Topic]和队列[Queue]两种,通过异步和同步的支持把消息发送到目的地[这里主要是消息地址],用于介质的形式或者数据库的形式存储与当前硬盘上。这里包括两种方式:

方式一:本地化消息生产消费处理:在一个主机上进行消息的生产和消费,发送者发送消息到指定的目的地上,消费者然后从指定的目的地读取消息进行消费。这种消息处理方式仅仅是用于一台机器运行消息服务的。

方式二:局域的网络联邦生产消费处理:生产环境处于一个局域网或者一个广域网。之间的业务是分布在不同的服务器上的[不同的ip主机]。如果多台主机通信必须解决多点自动发现和动态连接的功能。例如:主机A和主机B都运行着消息服务器,假如往主机A上发送消息,但是主机A上并没有消费者,然而,主机 B上有一个消费者在等待,但是主机B上没有消息发送,此时,主机A主机B之间能够自动路由并且动态的发现连接,那么,主机A上的消息会发送到主机B上。这样就进行 了消息的桥接存储转发。

使用jms传递消息不仅能够稳定的传递而其可以对传递过程中的 数据进行实时的处理和使用一些策略来更好的处理消息。不仅仅是包括事务、安全、策略、性能等。从传输上可以使用多种协议来根据不同的业务来改变成最优化的传递。有nio,udp、tcp、multicast、ssl、vm等等。

目前是mdb[消息驱动bean]来异步的监听消息的接收。仅仅需要实现 MessageDrivenBean, MessageListener类即可。

目前jms支持异构系统。


目标:主要基于jms消息通信。实现独立化?丰富化?稳定化?

原因:不同厂商的实现不同,有些支持或者有些完全支持或者已经超出规范的范围。功能自然不同。

1.       制定一些策略和传输协议来配置消息的传递,例如:vm、udp、multicast、nio、tcp、ssl、xmpp协议等等、存储桥接策略、 master/slaver策略、恢复策略等等。提高了消息传递的质量和保障。同时也适应不同的业务场景的应用。

2.       提供jms消息的web管理

3.       支持联邦jms消息传递

4.       增强消息过滤功能

5.       增强消息消费者的权限策略

6.       支持多点传输和断点传输和消息压缩、加密、切分。

7.       支持发布/持久化订阅

8.       支持多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP

9.       支持通过JDBC和journal提供高速的消息持久化

10.    ActiveMQ:最佳的开源 JMS 实现。

原因:

在 JMS 术语中,ActiveMQ 是一个成熟而又功能丰富的 JMS 服务器或消息代理。 ActiveMQ 支持许多不同的传输(如 TCP、SSL、UDP、多点传送、内部 JVM 和 NIO)和客户机交互(如推、拉和发行/订阅)。以一定规模的现有用户为基础,ActiveMQ 服务器完全可以独立工作,而不依赖任何容器(J2EE 或其他容器),它还可以与 J2EE 服务器主机(如 Geronimo)结合使用。从设计上保证了高性能的集群,客户端-服务器,点对点。




例如:

public class EsbJmsBean2 implements MessageDrivenBean, MessageListener {

   protected static final Logger logger = Logger.getLogger(EsbJmsBean2.class);

  

   private JMSMessageHandler handler = null;

  

   private MessageDrivenContext context;

  

   public void ejbCreate() throws EJBException {

      handler = new JMSMessageHandler();

   }

   public void ejbRemove() throws EJBException {

      handler = null;

      context = null;

   }

   public void setMessageDrivenContext(MessageDrivenContext context)

          throws EJBException {

      this.context = context;

   }

   public void onMessage(Message msg) {    

//业务逻辑

   }


l  Ejb协议:

  Ejb协议,大家可能用的不一定多。这里就不要不讲ejb是什么,主要是如何用用在业务场景中。Ejb内部实现了rmi的一些机制,底层走的仍然是socket通信。Ejb必须依赖于容器才能运行的,例如:jboss、weblogic等等。

通过JNDI来连接到ejb服务的。

例如:你使用ejb做了一个简单的hello级的示例,它也是一个ejb服务;要想运行起来,必须发布到应用服务器中。

以jboss示例如下:

DomainFacade.java

public interface DomainFacade extends EJBObject {

         public String invoke(String id) throws RemoteException;

}

DomainFacadeBean.java

public class DomainFacadeBean implements SessionBean  {

         private static final long serialVersionUID = 1L;

         SessionContext sessionContext;

    public void ejbCreate() throws CreateException {

    }

    public void ejbRemove() throws javax.ejb.EJBException, java.rmi.RemoteException {

    }

       public void ejbActivate() throws javax.ejb.EJBException, java.rmi.RemoteException {

    }

    public void ejbPassivate() throws javax.ejb.EJBException, java.rmi.RemoteException {

    }

    public void setSessionContext(SessionContext sessionContext) {

        this.sessionContext = sessionContext;

    }

    protected void onEjbCreate() {

    }

    public String invoke(String id) throws RemoteException {

             System.out.println("远程。。。。。。。。。。。。。。");

             QueryObject query=new QueryObject();

             Company compnay=query.getCompany(id);

             String xml=new ParseXml().createXMLFile(compnay);

        return xml;

    }

}

DomainFacadeHome.java

public interface DomainFacadeHome extends javax.ejb.EJBHome {

         public DomainFacade create() throws CreateException, RemoteException;

}


配置ejb-jar.Xml

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar>

    <enterprise-beans>

        <session>

                          <display-name>DomainFacadeBean</display-name>

            <ejb-name>DomainFacadeBean</ejb-name>

             <home>com.css.sword.esb.ejb2.DomainFacadeHome</home>

             <remote>com.css.sword.esb.ejb2.DomainFacade</remote>

            <ejb-class>com.css.sword.esb.ejb2.DomainFacadeBean</ejb-class>

            <session-type>Stateless</session-type>

            <transaction-type>Container</transaction-type>

        </session>

    </enterprise-beans>

</ejb-jar>


以上发布了一个简单的ejb服务。

客户端通过以下来调用ejb服务:

Properties env = new Properties();

   env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");

   env.setProperty(Context.PROVIDER_URL, "10.10.13.218:1099");

   env.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");

   Context ctx = new InitialContext(env);

   Object obj = ctx.lookup("DomainFacadeBean");

   DomainFacadeHome home = (DomainFacadeHome) PortableRemoteObject.narrow(obj, EJBHome.class);

   obj = home.create();

   String result=((DomainFacade)obj).invoke(sfzjhm);


l  Web服务协议:

使用 Web 服务技术,应用程序可以与平台和编程语言无关的方式相互通信。Web 服务是一个软件接口,它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。它使用基于 XML 语言的协议来描述要执行的操作或者要与另一个 Web 服务交换的数据。在面向服务的体系结构(Service-Oriented Architecture,SOA)中,一组以这种方式交互的 Web 服务定义了特定的 Web 服务应用程序。

Web 服务所使用的 XML 可以用真正与平台无关的方式来描述任何(所有)数据,以跨系统交换数据,因此转向了松耦合应用程序。而且,Web 服务可以在较抽象的层面上工作,较抽象层面可以按照需要动态地重新评估、修改或处理数据类型。所以,从技术层面上讲,Web 服务可以更方便地处理数据,并且允许软件更自由地进行通信。

Web 服务主要是技术的集成。不过,它本身是独立于形式的。如前所述,组成 Web 服务的技术通常是用 XML 进行定义和交互的。然而,由于 XML 本身是一种独立的语言,所以 Web 服务也是独立的。因此,可以用许多编程语言(其中包括 Java、Python、Perl、C#、Basic 等等)来开发 Web 服务




Web服务是目前应用最多的技术了,目前成熟的框架有axis2,xfire、cxf等等。

Web服务不需要依赖于应用服务器。仅仅servlet容器就可以了。目前使用很多的tomcat即可。它走的是http协议。

通过发布一个websevice生产wsdl即web服务发布成功。

具体的示例就不介绍 了,网上一搜一堆。

发布成功了一个web服务,用以下方法测试一下即可。

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();  

        Client client = dcf.createClient("http://localhost:8687/xfire/services/getCompanyInfo?wsdl");  

        Object [] results = client.invoke("你的方法名称", new Object[]{..});


//参数放到一个数组中eg: new Object[]{“1”}传递一个字符串参数

转自:http://blog.csdn.net/whaosy/archive/2010/08/04/5785978.aspx
分享到:
评论

相关推荐

    基于MQTT协议的推送

    7. **ActiveMQ与MQTT**:ActiveMQ是Apache开发的一款开源消息中间件,它支持多种消息协议,包括MQTT。通过集成ActiveMQ,开发者可以构建基于MQTT的高性能、可扩展的消息传递系统。 8. **Swing界面应用**:在描述中...

    基于TCP协议的简单即时通信软件的设计与实现(含源文件).pdf

    TCP协议通过建立连接、数据分片、错误检测和重传机制,确保了数据的完整性和顺序性,非常适合需要稳定和高可靠性的通信场景,如即时通信。 在基于TCP协议的即时通信软件设计中,通常采用C/S(Client/Server)架构,...

    (源码)基于Spring Boot和WebSocket的实时消息系统.zip

    本项目是一个基于Spring Boot框架和WebSocket协议的实时消息系统,旨在提供高效、实时的消息传递服务。系统支持多种消息类型,包括文本、文件等,并具备权限管理和用户认证功能。通过WebSocket协议,客户端可以实时...

    Android基于MQTT协议利用ActiveMQ发送消息给Android端接收

    它利用了MQTT的轻量级特性以及ActiveMQ的高性能和易用性,为Android应用提供了可靠且实时的消息传递机制。开发者需要熟悉Android编程、MQTT协议以及ActiveMQ的配置和管理,才能有效地实现这样的系统。

    基于RTP协议的实时视频监控系统的实现[1]

    ### 基于RTP协议的实时视频监控系统的实现 #### 一、引言 随着数字化时代的来临,视频监控技术正朝着更为智能化、网络化的方向发展。基于此背景,研究和开发一种高效的实时视频监控系统变得尤为重要。本文介绍了一...

    基于xmpp协议的多端即时通讯方案

    通过以上介绍,我们可以看到,基于XMPP协议的多端即时通讯方案不仅能够实现不同即时通信软件之间的互联互通,还能支持多种设备类型,为用户提供更加便捷、高效的沟通体验。同时,选择开源的Openfire作为服务器端,...

    Java语言实现基于消息传递的网络通信

    ### Java语言实现基于消息传递的网络通信 #### 一、理论基础 ##### 1.1 套接字通信 套接字(Socket)是一种在计算机网络中进行数据通信的标准接口,它允许不同主机间的进程进行通信。在TCP/IP协议栈中,套接字为...

    基于ActiveMQ的消息总线逻辑与物理架构设计详解

    在实施基于ActiveMQ的消息总线逻辑与物理架构设计时,需要注意消息中间件的核心功能实现、SOA设计原则的遵循、企业应用系统的解耦与服务共享、前端架构设计、消息流转机制以及多种消息队列技术的选择与对比。...

    基于XMPP协议文件传输的研究与实现

    它能够支持即时消息传递、在线状态检测以及多种其他特性,同时具备良好的跨平台兼容性和扩展性。 #### XMPP协议的工作原理与特点 ##### 工作原理 XMPP的核心思想源自于电子邮件系统的设计理念,采用了逻辑寻址...

    基于UDP 通信协议的设计与实现

    - **对绝大多数基于消息包传递的应用程序更为直接和有效**:对于不需要保证数据完整性的实时应用(如语音通话、视频会议),UDP的非连接特性使其成为更优选择。 - **系统冗余和任务分担容易实现**:UDP的简单性为...

    openfire消息机制和源码分析

    1. XMPP协议是一个基于XML的即时消息传递协议,它支持多种即时通信软件,其中Gtalk是基于XMPP协议的一个著名实现。XMPP协议的开放性意味着任何人都可以基于该协议开发自己的即时通信应用。 2. Openfire作为一个XMPP...

    基于可扩展消息处理现场协议的智能家居系统.pdf

    在智能家居系统中,可以利用XMPP协议的即时通讯特性进行设备之间的消息传递,实现设备控制与状态反馈等功能。 在文章中提到,系统主要由三部分组成:camera设备端、viewer客户端和openfire服务器。camera设备端主要...

    基于中国移动cmpp3协议开发的短信网关

    2. **消息类型**:CMPP3协议定义了多种消息类型,如CMPP_SUBMIT用于短信提交,CMPP_DELIVER用于短信接收,CMPP_QUERY用于查询短信状态,CMPP_ACTIVE_TEST用于链路检测等。 3. **消息格式**:每个CMPP消息由消息头和...

    SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。

    **SOAP(Simple Object Access Protocol)** 是一种基于 XML(Extensible Markup Language)的通信协议,它的设计目的是为了在分布式环境中提供轻量级的信息交换机制。SOAP 允许应用程序通过 HTTP(Hypertext ...

    基于UDP通信协议的设计与实现

    本文提出了一种基于UDP的可靠通信协议设计方案,通过引入多种机制来改善UDP协议的不足之处,尤其是在可靠性和连接管理方面。这种改进后的协议能够在保持UDP原有优点的同时,显著提高数据传输的可靠性和稳定性,适合...

    NGN资料(相关协议信令)

    SIP是一种应用层的控制协议,用于创建、修改和终结多媒体会话,包括互联网电话、视频会议、即时消息等多种服务。SIP广泛应用于NGN中,因为它支持分布式、基于文本的简单架构,易于扩展和实现新的服务。 4. **H.323...

    基于STM 32的BACnet协议设计研究.pdf

    MS/TP(Master-Slave/Token Passing)是一种用于BACnet设备的串行通信协议,它采用主从结构和令牌传递机制来协调各站点间的信息交换,确保数据传输的有序和可靠。 BACnet协议中的各项服务,例如设备管理服务...

    电信设备-一种基于MODBUS的多协议转换警情信息远程传输系统.zip

    标题中的“电信设备-一种基于MODBUS的多协议转换警情信息远程传输系统”揭示了这个主题主要关注的是电信行业中,使用MODBUS协议实现多协议转换的警情信息远程传输技术。MODBUS是一种广泛应用于工业自动化领域的通信...

    基于xmpp协议的多端即时通讯

    2. Xmpp协议内容:XMPP定义了客户端与服务器、服务器与服务器之间进行即时消息传递和在线状态呈现信息交换的机制。 3. Xmpp协议优点:XMPP协议基于XML,具有很好的扩展性,可以携带复杂的数据和多种格式的文件,...

Global site tag (gtag.js) - Google Analytics