多次部署具有通用服务名称的Axis2服务组

时间:2013-04-25 08:12:21

标签: java web-services deployment axis2

我目前有一个只有一个未命名服务的Axis2 Web服务,Axis2使用.aar文件或服务目录的名称生成服务名称,具体取决于我是否自动部署服务。这样我就可以在Axis2的services-directory中的不同服务文​​件夹下使用一些不同的配置文件部署相同的服务,而无需配置不同的服务名称。如下所示:

  • [...]的axis2 \ WEB-INF \服务\服务1 \ META-INF \ service.xml中
  • [...]的axis2 \ WEB-INF \服务\服务2 \ META-INF \ service.xml中
  • [...]的axis2 \ WEB-INF \服务\服务3 \ META-INF \ service.xml中

在这个例子中,我将部署相同的服务三次,其文件夹中只有不同的配置文件,这意味着service.xml对于所有服务都是相同的。如果我提供了服务名称,这将无效,因为服务名称在所有Axis2服务中都必须是唯一的。

不,我想在上面提供的服务中添加第二项服务,这意味着每项服务都包含一个至少包含两项服务的服务组。在这种情况下,Axis2需要服务的名称,我希望它是通用的,并且在所有服务中都是相同的,因为我不想为每个部署的服务更改service.xml。我想将我的服务称为“上传”,“下载”等。

默认情况下,Axis2无法使用相同的命名服务部署三个服务,但我可以做的是实现接口ServiceLifeCycle并将startUp方法中的服务名称更改为唯一的,例如通过生成随机UUID或其他任何东西。这样服务名称就不再是确定性的了,因此我更喜欢服务部署文件夹的命名方案,它在service.xml中配置的服务名称前面。如下所示:

  • service1.Upload
  • service1.Download
  • service2.Upload
  • service2.Download [...]

似乎我是unable to get the deployment folder of the service during it's startUp method call,因此您是否了解部署由具有通用命名服务的服务组组成的服务的其他方法?请记住,总体目标是约定优于配置,我根本不想为每个部署的服务更改service.xml,而只是将服务部署到不同的唯一文件夹中。

谢谢!

1 个答案:

答案 0 :(得分:0)

可以使用AxisService.getClassLoader()。getResource()来访问服务文件夹中的文件,并获取服务文件夹的绝对路径。根据访问的文件,您可以通过获取所访问文件的父项和一些约定来简单地确定服务的部署文件夹。如果您具有部署文件夹,则可以使用服务组中的名称和配置的服务名称将其设置为生命周期类的startUp方法中的新服务名称。由于部署文件夹在Axis2的整个服务文件夹中已经是唯一的,因此您可以使用所有服务的独特内容,并且可以使用您希望使用此命名约定命名部署文件夹的任何约定,以便Web服务客户端访问该服务。

重要的部分只是更改生命周期类的startUp方法中的服务名称,因为服务名称之后只需要是唯一的,并使用类加载器获取一个服务目录的绝对路径。

Thanks to Kenster for using the class loader.