且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Mule web service调用中的复杂类型传递

更新时间:2022-08-25 14:11:19


  官网上很辛苦在一个旮旯里找到如何向 Mule暴露的axis web service 传递复杂数据类型 ,http://www.mulesource.org/pages/viewpage.action?pageId=4678, 官网上只提供了原理,自己补充了一下客户端测试代码,部分服务类做了修改。
   
  类清单:
  Person: 数据类,测试复杂数据类型的传递
  PersonService: 服务接口类
  PersonServiceImpl: 服务实现类。
  PersonServiceLaucher: Mule服务器启动类
  PersonClient: 客户端测试类。
  person-config.xml, Mule 配置,其中将 PersonServiceImpl 暴露为一个axis1.4的服务。

1. Person数据类
Java代码 Mule web service调用中的复杂类型传递 Mule web service调用中的复杂类型传递Mule web service调用中的复杂类型传递
  1. public class Person  
  2.   { 
  3. private String name; 
  4. private String surname; 
  5. private Date registerDate = new Date(); 
  6. private int age = 20
  7.    ... 
  public class Person 
   {
	private String name;
	private String surname;
	private Date registerDate = new Date();
	private int age = 20;
    ...


2.  服务接口类
Java代码 Mule web service调用中的复杂类型传递 Mule web service调用中的复杂类型传递Mule web service调用中的复杂类型传递
  1. public interface PersonService {    
  2. String printPerson(Person person) ;  
  3. Person createPerson(String name,String surname,int age);     
  4.     Person[] batchCreatePerson(String namePattern); 
  public interface PersonService {	
	String printPerson(Person person) ;	
	Person createPerson(String name,String surname,int age);	
 	Person[] batchCreatePerson(String namePattern);
  }


3. 实现类:
Java代码 Mule web service调用中的复杂类型传递 Mule web service调用中的复杂类型传递Mule web service调用中的复杂类型传递
  1. package demo.mule.person; 
  2.  
  3. public class PersonServiceImpl implements PersonService { 
  4.     public String printPerson(Person person) {       
  5.         return "person:name=" + person.getName() +",surname=" + person.getSurname(); 
  6.     } 
  7.      
  8.     /**
  9.      * test return a complex type by web service
  10.      */ 
  11.     public Person createPerson(String name, String surname,int age) { 
  12.         Person p = new Person(name,surname); 
  13.         p.setAge(age); 
  14.         System.out.println("a person is created:" + p.getName()); 
  15.         return p; 
  16.     } 
  17.      
  18.     public Person[] batchCreatePerson(String namePattern) { 
  19.         Person[] persons = new Person[3]; 
  20.         for (int i = 0; i < persons.length; i++) { 
  21.             Person p = new Person(namePattern + i,namePattern + i); 
  22.             p.setAge( 20 + i ); 
  23.             persons[i] = p; 
  24.         } 
  25.         return persons; 
  26.     } 
package demo.mule.person;

public class PersonServiceImpl implements PersonService {
	public String printPerson(Person person) {		
		return "person:name=" + person.getName() +",surname=" + person.getSurname();
	}
	
	/**
	 * test return a complex type by web service
	 */
	public Person createPerson(String name, String surname,int age) {
		Person p = new Person(name,surname);
		p.setAge(age);
		System.out.println("a person is created:" + p.getName());
		return p;
	}
	
	public Person[] batchCreatePerson(String namePattern) {
		Person[] persons = new Person[3];
		for (int i = 0; i < persons.length; i++) {
			Person p = new Person(namePattern + i,namePattern + i);
			p.setAge( 20 + i );
			persons[i] = p;
		}
		return persons;
	}
}


4. person-config.xml
Xml代码 Mule web service调用中的复杂类型传递 Mule web service调用中的复杂类型传递Mule web service调用中的复杂类型传递
  1.   <?xml version="1.0" encoding="UTF-8"?> 
  2. <!DOCTYPE mule-configuration PUBLIC "-//MuleSource //DTD mule-configuration XML V1.0//EN" "http://mule.mulesource.org/dtds/mule-configuration.dtd"> 
  3. <mule-configuration id="mule-test" version="1.0"> 
  4.     <model name="personService"> 
  5.         <!-- test: http://localhost:8082/services/personService?method=createPerson -->            
  6.         <mule-descriptor name="personService" implementation="demo.mule.person.PersonServiceImpl"> 
  7.             <inbound-router> 
  8.                 <endpoint address="axis:http://localhost:8082/services"></endpoint> 
  9.             </inbound-router>      
  10.             <!-- not nessesary  
  11.             <properties> 
  12.                 <property name="style" value="wrapped"/> 
  13.                 <property name="use" value="literal"/> 
  14.             </properties>      
  15.             --> 
  16.         </mule-descriptor>             
  17.     </model> 
  18. </mule-configuration> 
  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mule-configuration PUBLIC "-//MuleSource //DTD mule-configuration XML V1.0//EN" "http://mule.mulesource.org/dtds/mule-configuration.dtd">
<mule-configuration id="mule-test" version="1.0">
	<model name="personService">
		<!-- test: http://localhost:8082/services/personService?method=createPerson -->			
		<mule-descriptor name="personService" implementation="demo.mule.person.PersonServiceImpl">
			<inbound-router>
				<endpoint address="axis:http://localhost:8082/services"></endpoint>
			</inbound-router>		
			<!-- not nessesary 
			<properties>
				<property name="style" value="wrapped"/>
				<property name="use" value="literal"/>
			</properties>		
			-->
		</mule-descriptor>			
	</model>
</mule-configuration>



5. server启动
Java代码 Mule web service调用中的复杂类型传递 Mule web service调用中的复杂类型传递Mule web service调用中的复杂类型传递
  1.   public class PersonServiceLaucher { 
  2. public static void main(String[] args) throws ConfigurationException { 
  3.     MuleXmlConfigurationBuilder muleXmlConfigurationBuilder = new MuleXmlConfigurationBuilder(); 
  4.     UMOManager manager = muleXmlConfigurationBuilder.configure("demo/mule/person/person-config.xml"); 
   public class PersonServiceLaucher {
	public static void main(String[] args) throws ConfigurationException {
		MuleXmlConfigurationBuilder muleXmlConfigurationBuilder = new MuleXmlConfigurationBuilder();
		UMOManager manager = muleXmlConfigurationBuilder.configure("demo/mule/person/person-config.xml");
	}
}



6. 测试类
Java代码 Mule web service调用中的复杂类型传递 Mule web service调用中的复杂类型传递Mule web service调用中的复杂类型传递
  1. public class PersonClient {     
  2.     private MuleClient muleClient ;  
  3.     public PersonClient() { 
  4.         try
  5.             muleClient = new MuleClient(); 
  6.         } catch (UMOException e) {       
  7.             e.printStackTrace(); 
  8.         } 
  9.     } 
  10.  
  11.     public void testPrintPerson() throws Exception { 
  12.          
  13.         Person person = new Person("David","Jones"); 
  14.         UMOMessage msg = new MuleMessage(person ); 
  15.         UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=printPerson",msg); 
  16.          
  17.         System.out.println("message:" + message.getPayloadAsString()); 
  18.     } 
  19.      
  20.     public void testCreatePerson() throws Exception { 
  21.         Object[] args = new Object[]{"小龙","李", new Integer(23)}; 
  22.         UMOMessage msg = new MuleMessage(args ); 
  23.         UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=createPerson",msg); 
  24.      
  25.         Person p = (Person)message.getPayload(); 
  26.         System.out.println("message:" + message.getPayloadAsString()); 
  27.         System.out.println("payload:" + p.getName() +"," + p.getSurname() +"," + p.getAge()); 
  28.     } 
  29.      
  30.     public void testBatchCreatePerson() throws UMOException { 
  31.         Object[] args = new Object[]{"Admin"}; 
  32.         UMOMessage msg = new MuleMessage(args ); 
  33.         UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=batchCreatePerson",msg); 
  34.          
  35.         Person[] ps = (Person[])message.getPayload(); 
  36.         System.out.println("persons:" + ps.length); 
  37.         for (int i = 0; i < ps.length; i++) { 
  38.             Person p = ps[i]; 
  39.             System.out.println("person:" + p.getName() +"," + p.getSurname() +"," + p.getAge()); 
  40.         }        
  41.     } 
  42.     public static void main(String[] args) throws Exception { 
  43.         PersonClient personClient = new PersonClient(); 
  44.         personClient.testPrintPerson(); 
  45.         personClient.testCreatePerson();         
  46.         personClient.testBatchCreatePerson(); 
  47.     } 
 public class PersonClient {	
	private MuleClient muleClient ;	
	public PersonClient() {
		try {
			muleClient = new MuleClient();
		} catch (UMOException e) {		
			e.printStackTrace();
		}
	}

	public void testPrintPerson() throws Exception {
		
		Person person = new Person("David","Jones");
		UMOMessage msg = new MuleMessage(person );
		UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=printPerson",msg);
		
		System.out.println("message:" + message.getPayloadAsString());
	}
	
	public void testCreatePerson() throws Exception {
		Object[] args = new Object[]{"小龙","李", new Integer(23)};
		UMOMessage msg = new MuleMessage(args );
		UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=createPerson",msg);
	
		Person p = (Person)message.getPayload();
		System.out.println("message:" + message.getPayloadAsString());
		System.out.println("payload:" + p.getName() +"," + p.getSurname() +"," + p.getAge());
	}
	
	public void testBatchCreatePerson() throws UMOException {
		Object[] args = new Object[]{"Admin"};
		UMOMessage msg = new MuleMessage(args );
		UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=batchCreatePerson",msg);
		
		Person[] ps = (Person[])message.getPayload();
		System.out.println("persons:" + ps.length);
		for (int i = 0; i < ps.length; i++) {
			Person p = ps[i];
			System.out.println("person:" + p.getName() +"," + p.getSurname() +"," + p.getAge());
		}		
	}
	public static void main(String[] args) throws Exception {
		PersonClient personClient = new PersonClient();
		personClient.testPrintPerson();
		personClient.testCreatePerson();		
		personClient.testBatchCreatePerson();
	}
}



测试过程:
1) 启动Mule服务容器
2) 执行PersonClient


总结:
  1) Mule暴露POJO为一个服务还是很简单的, 配置非常少
  2) 传递和返回Java复杂数据类型,自定义数据类型都非常方便。不过,客户端需要明确知道每个方法传递的参数个数和类型,以及返回的参数类型,并且需要自己type cast。 在具体项目中,可以自己再做一层封装或用AOP, 以本地调用的方式调用 mule 的web service。