【问题标题】:How to start()/stop() ear application programmatically in IBM WAS?如何在 IBM WAS 中以编程方式启动()/停止()耳朵应用程序?
【发布时间】:2016-11-02 13:40:09
【问题描述】:

我将使用 Arquillian 框架在 IBM WAS 8.5.5 上测试我的 ear 应用程序。我设法部署、启动并向我的耳朵应用程序发送 JMS 消息,并且耳朵已按计划处理此消息。根据我们的业务逻辑,每个 ear 都为其内部 EJB 组件之一实现 IBM 自动启动行为(比如它是无状态会话 Bean),因此组件的 ejb-jar.xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.1" 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/ejb-jar_3_1.xsd">
    <enterprise-beans>
        <session>
            <ejb-name>MyBusinessEjb</ejb-name>
            <home>com.ibm.websphere.startupservice.AppStartUpHome</home>
            <remote>com.ibm.websphere.startupservice.AppStartUp</remote>
        </session>
        ...

一些内部EJB的代码是:

@Stateless(name = "MyBusinessEjb")
@TransactionManagement(TransactionManagementType.CONTAINER)
public class MyBusinessEjbBean implements TimedObject {

    public boolean start() {
        ... init some resources here
        return true;
    }

    public void stop() {
        ... free resources here
    }

    ...

但是可惜——Arquillian 不允许应用程序调用 start() 和 stop() 方法。当管理员从 IBM Console 运行应用程序时,它们会自动调用(不使用带注释的或部署描述符指定的拦截器,只是由 IBM WAS 调用)。 在我的测试 EJB 中(当我的 ear 应用程序已经部署时,它由 arquillian 加载)我可以查找 MyBusinessEjb:

public void tryToCallStart() throws NamingException {
    InitialContext ic = new InitialContext();
    Object beanObj = ic.lookup("java:global/ear-app-1.0.0/ejb-module/MyBusinessEjb");
    AppStartUpHome beanHome = (AppStartUpHome) PortableRemoteObject.narrow(beanObj, AppStartUpHome.class);

但是 JNDI 只返回 AppStartUpHome 存根,而不是我可以调用 startup() 的 AppStartUp,以及以下内容:

beanHome.create().start();

当然只是创建并启动另一个 bean 实例,而不是我的 :(

那么如何在 Arquillian 测试运行之前或期间在我的 ear-app-1.0.0 中调用 MyBusinessEjb 上的 start() 方法?或者也许有人对如何调用 start() 有任何其他想法 - 使用 arquillian.xml 或 Maven pom.xml 执行我的测试?

【问题讨论】:

    标签: unit-testing jakarta-ee websphere jboss-arquillian


    【解决方案1】:

    我知道在 WebSphere 中是否以编程方式启动或停止应用程序的唯一方法是使用 wsadmin 命令行界面中的 AdminControl。您可以编写一些代码来执行 wsadmin 脚本,该脚本将为您执行启动/停止。

    可能是这样的:(免责声明,未经测试)

    // any ${var} pieces are variables you will have to fill in
    ProcessBuilder pb = new ProcessBuilder("/path/to/wsadmin.sh/bat", 
      "-conntype SOAP}",  
      "-host ${HOST}",
      "-port ${SOAP_PORT}",
      "-user ${USER_ID}",
      "-password ${PASS}",
      "-c $AdminControl invoke " + 
         "[$AdminControl queryNames cell=${CELL},node=${NODE},type=ApplicationManager,process=${PROCESS},*]" + 
         " startApplication ${APPLICATION_NAME}");
    Process p = pb.start();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多