Liberty 应用程序服务器上的 Quartz 计划作业调用 REST 抛出异常

Quartz scheduled job on Liberty app-server calling REST throwing exception

我在应用程序服务器中获取 quartz 作业来调用 REST 服务时遇到了真正的麻烦 - 完全困惑(:

我部署了 quartz (v 2.2.2) 并在带有 Java 1.8 的 IBM Liberty Application Server (v 8.5.5.8) 上工作 它扫描目录中的文件,然后调用我的虚拟任务。

但是,当我用 REST WebClient 调用替换 Dummy Task 时 - 我得到了一个非常奇怪的堆栈跟踪。

java.lang.NullPointerException
[err] at com.ibm.ws.jaxrs20.client.bus.LibertyJAXRSClientBusFactory.getClientScopeBus(LibertyJAXRSClientBusFactory.java:89)
[err] at com.ibm.ws.jaxrs20.client.JAXRSClientImpl.target(JAXRSClientImpl.java:109)
[err] at org.apache.cxf.jaxrs.client.spec.ClientImpl.target(ClientImpl.java:100)
[err] at notification.server.rest.MyIBMHandler.testClient4(MyIBMHandler.java:61) 

最后一行是我的,我写的代码只是基于此:https://www.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/twlp_jaxrs2.0_clientconfig.html

当我用谷歌搜索上面的异常时,除了一个与堆栈跟踪相关的异常之外,我没有看到太多:- 这让我相信这里可能存在某种形式的线程冲突。

为了证明我的 REST 客户端代码在我的 Liberty 应用程序服务器上没有问题,我确实将我的 REST 方法放入一个 servlet 并在那里调用它并且它确实工作正常。 即

public void testClient4() {
    javax.ws.rs.client.ClientBuilder cb = ClientBuilder.newBuilder();
    javax.ws.rs.client.Client c = cb.build();
    String res = null;

    try {
        String resourceURL = "http://localhost:9080/SampleRest/sample/";
        res = c.target(resourceURL).path("Greeting").request().get(String.class);
        System.out.println("res:" + res);
    } catch (Exception e) {
        res = "[Error]:" + e.toString();
        System.err.println("error:" + e.getMessage());
        e.printStackTrace();
    } finally {
        if (c != null)
            c.close();
        System.out.println("res:" + res);
    }
}

我的 Quartz 道具接近开箱即用,这里是线程池部分:-

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 4
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

我的工作 class 使用注释 - @DisallowConcurrentExecution

我正在使用 jersey 2.17 库和 jackson 库 我在我的 Liberty 配置文件中添加了许多功能 - 即

<featureManager>
    <feature>jsp-2.3</feature>
    <feature>jaxrs-2.0</feature>
    <feature>servlet-3.1</feature>
    <feature>apiDiscovery-1.0</feature>
    <feature>jaxrsClient-2.0</feature>
</featureManager>

目前,调用的 REST 服务是一个简单的服务。 当 运行 石英在应用程序服务器中时,我是否需要执行任何配置才能调用 REST 服务? - 有人让这个工作吗?

看来我们在最新的 Liberty 修复包中修复了这个 NPE,看起来 here,8.5.5.9 修复包计划在 3 月 18 日可用。一旦发布,请测试并确定它是否修复了这个问题, 如果没有请告诉我们。