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

来源:互联网 发布:php留言板源代码 编辑:程序博客网 时间:2024/05/07 08:03

目前,很常用的传输数据协议有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”}传递一个字符串参数

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dengjianli/archive/2010/05/04/5557568.aspx

原创粉丝点击