在 WebSphere 8 上播放 1.2.x

Posted

技术标签:

【中文标题】在 WebSphere 8 上播放 1.2.x【英文标题】:Play 1.2.x on WebSphere 8 【发布时间】:2012-09-17 22:30:02 【问题描述】:

我想将一个简单的 Play (1.2.4) 应用程序部署到 WebSphere 8。我让该应用程序在 Windows 上本地运行。两者都是 Java 1.6。我使用以下方法创建了一个 WAR 文件:

play clean
play war --zip -o c:\sampleapp

然后修改生成的 web.xml 以定义我的服务器数据源,再次构建 war 文件并部署。在部署期间,它从 web.xml 中找到了我的资源引用,并将其绑定到 WAS 定义的数据源。然后我将类加载器顺序更改为“最后一个父级”(基于 Play 部署选项页面和其他线程)。然后我启动了应用程序,没有任何错误。

我有一个扩展 play.jobs.Job 的类,它带有一个标记为 @OnApplicationStart 的方法。当我通过 WAS 控制台启动新安装的应用程序时,它会启动并执行此方法,该方法连接到数据源并加载一些数据并将其放入缓存中。

当我尝试访问我的第一个控制器时,问题就出现了,我得到了这个错误:

[9/17/12 16:19:48:132 CDT] 00000022 servlet       I com.ibm.ws.webcontainer.servlet.ServletWrapper init SRVE0242I: [sampleapp] [/sampleapp] [play]: Initialization successful.
[9/17/12 16:19:48:773 CDT] 00000022 SystemOut     O 16:19:48,772 ERROR ~

@6bl9mfbm1
Internal Server Error (500)

Execution exception (In /app/controllers/Application.java around line 41)
RuntimeException occured : play.mvc.Scope$Session

play.exceptions.JavaExecutionException: play.mvc.Scope$Session
        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231)
        at play.server.ServletWrapper$ServletInvocation.execute(ServletWrapper.java:557)
        at play.Invoker$Invocation.run(Invoker.java:278)
        at play.server.ServletWrapper$ServletInvocation.run(ServletWrapper.java:548)
        at play.Invoker.invokeInThread(Invoker.java:68)
        at play.server.ServletWrapper.service(ServletWrapper.java:142)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1214)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
        at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
        at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1027)
        at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3703)
        at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
        at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:962)
        at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
        at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
        at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
        at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
        at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
        at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
        at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
        at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
        at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
        at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
        at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659)
Caused by: java.lang.RuntimeException: play.mvc.Scope$Session
        at javassist.runtime.Desc.getClassType(Desc.java:156)
        at javassist.runtime.Desc.getType(Desc.java:122)
        at javassist.runtime.Desc.getType(Desc.java:78)
        at controllers.Application.connected(Application.java:41)
        at controllers.Application.index(Application.java:49)
        at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)
        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)
        at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478)
        at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)
        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
        ... 28 more

这是我的相关控制器代码:

public class Application extends Controller 

    @Before(unless="login","index")
    static void addUser() 
        User user = connected();
        if(user != null) 
            flash.put("user", user);
//          renderArgs.put("user", user);
         else 
            flash.error("Please log in.");
            index();
        

    

    static User connected() 
//        if(renderArgs.get("user") != null) 
//            return renderArgs.get("user", User.class);
//        
        String username = session.get("user");   // Line 41 - Error!
        if(username != null) 
            return User.find("byUsername", username).first();
         
        return null;
    

    public static void index() 
        if(connected() != null) 
            Download.index(1);
        
        render();
      
    ..
    ..

错误似乎来自会话引用。请注意,引用 renderArgs 的注释行在激活时也会导致类似的错误。

javassist 是否在某处没有适当地“增强”?我尝试用最新版本替换 javassist jar,结果相同。

我正在努力让 Play 在此处的“企业”中发挥作用,所以我真的很希望这样做。截至 2012 年 9 月,我无法判断 Play 是否在 WAS8 上成功运行。我会考虑 Play 2 (java),但它似乎肯定不支持 WAS,并且插件 play2war 看起来也没有 WAS 支持。很傻,没有 WAS 就无法运行,但这是我们企业的现实。

更新: 我现在也尝试了 Play 1.2.5 并创建了一个新应用程序,并在 Application.index 方法中添加了一行 session.get("x") 。部署了war文件,第一次访问时遇到同样的错误。

【问题讨论】:

【参考方案1】:

抱歉,我没有针对您的问题的具体解决方案。

但是,请考虑以下线索。

WebSphere Application Server and Play!Framework How to deploy Play app to Websphere 7

不过,您也可以试试邮件列表 (play-framework@googlegroups.com),看看是否有人有解决方案或遇到同样的问题。您也可以通过邮件列表搜索。

一般来说,建议在生产中也使用播放服务器,因为它已经足够好了。如果你愿意,你也可以把 apache/nginx 放在前面。

【讨论】:

【参考方案2】:

也许这个问题可以通过调整 WebSphere 中的类加载器设置来解决。如果想到这一点让您不寒而栗,并且您希望 WAS 不会妨碍您,您可以尝试这种解决方法。

创建一个类似这样的启动作业:

@OnApplicationStart
public class Startup extends Job 

    public void doJob() 
        javassist.runtime.Desc.useContextClassLoader = true;
    

【讨论】:

以上是关于在 WebSphere 8 上播放 1.2.x的主要内容,如果未能解决你的问题,请参考以下文章

Spring 4,Websphere 8.5.5 上的 Hibernate JPA JarInputStreamBasedArchiveDescriptor 错误

添加另一个上下文根模拟 webseal - Websphere 8.5

OSGi 包中的 Websphere 8.5 + CXF。是不是可以?

Websphere 8.5.5 中的 Corba NameService 配置

如何使 WebSphere Application Server 上长时间运行的 Web 请求超时? [复制]

监控:嵌入 websphere 8.5.5 的 Tivoli 性能查看器在几分钟后停止