首页 » 技术分享 » 毕业一年总结专题6--Tuscany1.6发布WebService和hessian

毕业一年总结专题6--Tuscany1.6发布WebService和hessian

 

关于框架的文章这是最后一篇了,这是公司目前发布服务的方式,我把它抽出来。发布的配置不复杂。

要点一:Tuscnay1.6将所发布的服务绑定为hessian时,如果所用的hessian版本3.1.3,会报:Exception in thread "main" com.caucho.hessian.client.HessianRuntimeException: com.caucho.hessian.io.HessianProtocolException: 500,用的是4.0.7就可以

要点二:服务器是jboss eap 4.3

要点三:  加入j2ee5的几个lib包,貌似有javaee.jar就OK

要点四:使用整合spring对webservice调用时,会报“Caused by: javax.xml.ws.WebServiceException: Unable to create JAXBContext”,原因是传输的类型太复杂了(Map算复杂对象么),如果用简单的string方式,证明是成功的,这点hessian做的比较好

以下为Spring调用WebService服务的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-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/aop
	http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    
	<bean id="myServiceCtrl" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
		<property name="serviceInterface" value="com.shine.soa.MyServiceCtrl"/>
		<property name="wsdlDocumentUrl" value="http://10.168.2.56:8080/FrameWrok/ws/FrameWrok_MyServiceCtrl?wsdl"/>
	    <property name="namespaceUri" value="http://soa.shine.com/"/>
		<property name="serviceName" value="MyServiceCtrlService"/>
		<property name="portName" value="MyServiceCtrlPort"/>
	</bean>

	
</beans>

这一篇代码我会黏贴得详细点,原来CSDN不允许发附件啊,还以为我等级低呢

第一部分是代码:位置为src/main/java

package com.shine.soa;

/**
*  POJO
*/
 public class Message implements java.io.Serializable{
    
    
     
    /**
     * 
     */
    private static final long serialVersionUID = 1735228251595190659L;
    private String name;
    private Integer age;
    private Boolean married;
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }   
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the age
     */
    public Integer getAge() {
        return age;
    }
    /**
     * @param age the age to set
     */
    public void setAge(Integer age) {
        this.age = age;
    }
    /**
     * @return the married
     */
    public Boolean getMarried() {
        return married;
    }
    /**
     * @param married the married to set
     */
    public void setMarried(Boolean married) {
        this.married = married;
    }
    
    

}

接口:

package com.shine.soa;

import java.util.Map;

import javax.jws.WebService;

//注解是必须的哦
@WebService
public interface MyServiceCtrl {
    //heassian完全支持
    Message getMessage(String name,Integer age,Boolean married);
    //heassian完全支持
    Map<String, Object> getMap();
    //简单的数据类型,才可以用spring支持的方式调用webservice
    String getString(String name);
}

实现类:

/**
 * 
 */
package com.shine.soa;

import java.util.HashMap;
import java.util.Map;


/**
 * 
 *
 * <pre>
 * 修改日期		修改人	修改原因
 * 2013-2-8	zgy	新建
 * </pre>
 */
public class MyServiceCtrlImpl implements MyServiceCtrl {

    /* (non-Javadoc)
     * @see com.shine.soa.MyServiceCtrl#getString(java.lang.String)
     */
    @Override
    public String getString(String name) {
        return "Hello : " +name;
    }

    /* (non-Javadoc)
     * @see com.shine.soa.MyServiceCtrl#getMessage(java.lang.String, java.lang.Integer, java.lang.Boolean)
     */
    @Override
    public Message getMessage(String name, Integer age, Boolean married) {
        Message message = new Message();
        message.setName("name:"+name);
        message.setAge(age*2);
        message.setMarried(married);
        return message;
    }

    /* (non-Javadoc)
     * @see com.shine.soa.MyServiceCtrl#getMap()
     */
    @Override
    public Map<String, Object> getMap() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("1", 1);
        map.put("ZGY", "LHM");
        Message message = new Message();
        message.setAge(1);
        message.setMarried(true);
        message.setName("LDH");
        map.put("message", message);
        return map;
    }
    
    

}

要自定义一个监听类:

package com.shine.soa;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.tuscany.sca.host.embedded.SCADomain;
import org.apache.tuscany.sca.host.webapp.WebAppServletHost;

/**
 * 
 * 类说明:用于初始化SCADomain对象的Servlet上下文监听器,若需要使用SCA服务,则需要在指定WEB中配置此SCA上下文.
 * 
 * <pre>

 * </pre>
 */
public class ScaWebContextInitListener implements ServletContextListener {


    /**
     * 
     * 构造器
     * 
     * <pre>
     * 修改日期      修改人    修改原因

     * </pre>
     */
    public ScaWebContextInitListener() {
    }

    /**
     * 
     * 上下文初始化,获取上下文中的ScaDomain
     * 
     */
    public void contextInitialized(ServletContextEvent event) {
        SCADomain scaDomain = (SCADomain) event.getServletContext()
                .getAttribute(WebAppServletHost.SCA_DOMAIN_ATTRIBUTE);
        if (scaDomain == null) {
            System.err.print("ServletContext上下文未找到SCADomain!");
        } else {
            System.err.print("成功加载SCADomain对象.");
        }
    }

    /**
     * contextDestroyed.
     * 
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0) {

    }
}

下面是位于src/main/resources下的三个配置文件,非常关键

第一个配置文件是applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-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/aop
	http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    
    <!--这里可以加入自己的特殊处理-->
	
	
</beans>

第二个文件是SCA服务定义文件:spring-sca.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sca="http://www.springframework.org/schema/sca" xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd     http://www.springframework.org/schema/sca     http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd">
  <import resource="applicationContext.xml" />
  <bean id="myServiceCtrlImpl" class="com.shine.soa.MyServiceCtrlImpl" />
  <sca:service name="MyServiceCtrl" type="com.shine.soa.MyServiceCtrl" target="myServiceCtrlImpl" />
</beans>

第三个文件是SCA服务的发布文件:scaservices.composite

<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" xmlns:t="http://tuscany.apache.org/xmlns/sca/1.0" xmlns:rmi="http://tuscany.apache.org/xmlns/binding/rmi/1.0-SNAPSHOT" xmlns:e="http://hessian" xmlns:s="http://app.shine.com/FrameWrok/services" targetNamespace="http://app.shine.com/FrameWrok/services" name="FrameWrok">
  <component name="SpringServices">
    <implementation.spring location="WEB-INF/classes/spring-sca.xml" />
    <!-- services here -->
    <service name="MyServiceCtrl">
      <binding.ws uri="/ws/FrameWrok_MyServiceCtrl" />
      <e:binding.hessian uri="/hessian/FrameWrok_MyServiceCtrl" />
    </service>
  </component>
</composite>

下面的这个配置文件位于src/main/webapp/META-INF/sca-contribution.xml,文件中指定某个构件可以部署

<?xml version="1.0" encoding="UTF-8" ?>
<contribution xmlns="http://www.osoa.org/xmlns/sca/1.0" 
    xmlns:sjs="http://app.shine.com/FrameWrok/services">
   <deployable composite="sjs:FrameWrok"/>
 </contribution>

到最后是web.xml,在这里可以看到tuscany的影子

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
	<!-- Tuscany 配置 -->
    <listener>
        <listener-class>org.apache.tuscany.sca.host.webapp.TuscanyContextListener</listener-class>
    </listener>

    <filter>
        <filter-name>tuscany</filter-name>
        <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>tuscany</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

	
	<!-- 自定义SCA服务加载监听 -->
	<listener>
		<listener-class>com.shine.soa.ScaWebContextInitListener</listener-class>
	</listener>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	


</web-app>

大家别嫌弃哈,还有最后将整个环境需要用到的jar包列出来,Maven要用到私服服务器,应用很难跑起来的。jar包分两种,一种是编译时候用到的放在build路径,另外一种是启动应用用到的,放在服务器的lib或者应用的WEB-INF/lib。jar包其实就是环境,能跑起来就不必细究,跑不起来那就要看看是否jar包冲突啊,版本啊,缺包啊,等等。

这是build用到的jar包:

这是WEB-INF用到的jar包,此外还需用到jboss下的公共lib包:

服务启动了,总得让我用才证明成功了吧,其实可以先看看wsdl,:http://127.0.0.1:8080/FrameWrok/ws/FrameWrok_MyServiceCtrl?wsdl

        //使用代码访问hessian
        HessianProxyFactory hpf = new HessianProxyFactory();
        MyServiceCtrl szctrl = (MyServiceCtrl)hpf.create("http://localhost:8080/FrameWrok/hessian/FrameWrok_MyServiceCtrl");
        Message message = szctrl.getMessage("FUCK", 1, false);
        System.out.println(message.getName()+message.getAge()+message.getMarried());
        Map<String, Object> map = szctrl.getMap();
        System.out.println(map.get("1"));
        System.out.println(map.get("ZGY"));
        Message ldh = (Message)map.get("message");
        System.out.println(ldh.getName()+ldh.getAge()+ldh.getMarried());

概念在下一篇,大家肯定都看烦了

转载自原文链接, 如需删除请联系管理员。

原文链接:毕业一年总结专题6--Tuscany1.6发布WebService和hessian,转载请注明来源!

0