0

我目前有一个 Axis2 Web 服务,它只有一个未命名的服务,Axis2 使用 .aar 文件或服务目录的名称为该服务生成一个服务名称,这取决于我部署的服务是否会自动展开。这样,我可以在 Axis2 的服务目录中的不同服务文​​件夹下部署具有一些不同配置文件的相同服务,而无需配置不同的服务名称或其他。类似于以下内容:

  • [...]axis2\WEB-INF\services\service1\META-INF\service.xml
  • [...]axis2\WEB-INF\services\service2\META-INF\service.xml
  • [...]axis2\WEB-INF\services\service3\META-INF\service.xml

在此示例中,我将部署相同的服务 3 次,它们的文件夹中只有不同的配置文件,这意味着 service.xml 对于所有服务都是相同的。如果我提供了一个服务名称,这将不起作用,因为服务名称需要在所有 Axis2 服务中都是唯一的。

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

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

  • 服务1.上传
  • 服务1.下载
  • 服务2.上传
  • 服务2.下载 [...]

似乎我无法在它的 startUp 方法调用期间获取服务的部署文件夹,因此您知道部署由具有通用命名服务的服务组组成的服务的任何其他方法吗?请记住,总体目标是约定优于配置,我只是不想为每个部署的服务更改 service.xml,而只是将服务部署到不同的唯一文件夹中。

谢谢!

4

1 回答 1

0

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

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

感谢 Kenster 使用类加载器。

于 2013-04-26T07:31:06.787 回答