Openshift - 在 Wildfly 上部署简单 Java EE 应用程序失败

Openshift - deploying simple Java EE app on Wildfly fails

我正在尝试在 Openshift 上部署一个非常简单的应用程序。这是一个带有单个 WAR 和 EJB 模块的 EAR 项目。在 WAR 中有一个 REST 服务调用 EJB 模块中定义的 EJB。在本地和 Openshift 上,我使用的是 Wildfly 9.0.0 CR2 和 PostgreSQL 9.2。在本地部署时一切正常。在 Openshift 上部署相同的代码时,我在日志中收到以下错误:

2015-06-28 18:23:04,574 WARN  [org.jboss.as.clustering.jgroups] (MSC service thread 1-1) WFLYCLJG0006: property bind_addr for protocol org.jgroups.protocols.TCP attempting to override socket binding value 127.12.77.1 : property value 127.12.77.1 will be ignored
2015-06-28 18:23:04,574 WARN  [org.jboss.as.clustering.jgroups] (MSC service thread 1-1) WFLYCLJG0006: property bind_port for protocol org.jgroups.protocols.TCP attempting to override socket binding value 7600 : property value 7600 will be ignored
2015-06-28 18:23:06,252 INFO  [org.jboss.as.jpa] (ServerService Thread Pool -- 70) WFLYJPA0010: Starting Persistence Unit (phase 2 of 2) Service 'cooking.ear/cooking-ejb-1.0-SNAPSHOT.jar#cookingPU'
2015-06-28 18:23:08,165 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.jgroups.channel.ee: org.jboss.msc.service.StartException in service jboss.jgroups.channel.ee: java.security.PrivilegedActionException: java.net.BindException: [TCP] /127.12.77.1 is not a valid address on any local network interface
        at org.wildfly.clustering.jgroups.spi.service.ChannelBuilder.start(ChannelBuilder.java:79)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.security.PrivilegedActionException: java.net.BindException: [TCP] /127.12.77.1 is not a valid address on any local network interface
        at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:638)
        at org.jboss.as.clustering.jgroups.JChannelFactory.createChannel(JChannelFactory.java:99)
        at org.wildfly.clustering.jgroups.spi.service.ChannelBuilder.start(ChannelBuilder.java:77)
        ... 5 more
Caused by: java.net.BindException: [TCP] /127.12.77.1 is not a valid address on any local network interface
        at org.jgroups.util.Util.checkIfValidAddress(Util.java:3480)
        at org.jgroups.stack.Configurator.ensureValidBindAddresses(Configurator.java:902)
        at org.jgroups.stack.Configurator.setupProtocolStack(Configurator.java:118)
        at org.jgroups.stack.Configurator.setupProtocolStack(Configurator.java:57)
        at org.jgroups.stack.ProtocolStack.setup(ProtocolStack.java:477)
        at org.jgroups.JChannel.init(JChannel.java:854)
        at org.jgroups.JChannel.<init>(JChannel.java:159)
        at org.jboss.as.clustering.jgroups.JChannelFactory.run(JChannelFactory.java:96)
        at org.jboss.as.clustering.jgroups.JChannelFactory.run(JChannelFactory.java:93)
        at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:634)
        ... 7 more

提到的地址 - 127.12.77.1 是 $OPENSHIFT_WILDFLY_IP。 我不知道是什么导致了这个问题。首先,我认为这是一个数据库连接问题,因为它发生在启动持久性单元的第二阶段时。我在 Openshift 上连接到 DB 并看到它已成功创建,所以也许不是这样,但这是我正在使用的 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="cookingPU">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>java:jboss/datasources/PostgreSQLDS</jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL9Dialect" />
        </properties>
    </persistence-unit>
</persistence>

使用的数据源是默认的。 standalone.xml.

我没有做任何改变

我注意到的另一件事是,当我将任何 EJB 添加到项目时,会发生部署问题。 这是我尝试使用的一个简单的:

@Stateless
public class AnyEjb {
    public String hello() {
        return "Hi there!";
    }
}

这是在 EJB 模块中定义的。然后在网络模块中我有这个 class 调用它:

@Path("anything")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class AnyEndpoint {

    @EJB
    private AnyEjb anyEjb;

    @GET
    public String sayHi() {
        return anyEjb.hello();
    }
}

我不确定它是否以及如何与此 BindException 相关联。 我已经在本地尝试了 运行 这个应用程序,同时使用了 standalone 和 standalone-full-ha 配置文件,它在这两种情况下都有效。我只是觉得 Openshift 配置一定是有问题,但我不知道该去哪里找了。我对 Openshift 和 Java EE 很陌生。请指出我正确的方向。任何帮助将不胜感激。

可能是 https://issues.jboss.org/browse/JGRP-1928。与 Rado Husar 交谈以了解如何解决此问题。

看起来问题(如@Bela Ban 所建议的那样)与 WildFly 9.0.0CR2 附带的 JGroups 版本有关。我将等待 WildFly 最终版本的修复。

同时,为了能够在 Openshift 上的 WildFly 9.0.0CR2 上部署应用程序,我决定禁用我的服务器的集群功能。 在 .openshift 中可用的 standalone.xml 中,我删除了 org.jboss.as.clustering.jgroups 模块并将 infinispan 缓存设置从分布式更改为本地。

我一直基于这个解决方案(对于 WildFly 8):https://gist.github.com/fjuma/3df7f64fbaebd5506ef5#file-standalone-xml

但我不得不对其进行修改,以便它可以在 Wildfly 9 上运行。完整的 standalone.xml 对我有用,可在此处获取以供参考 http://pastebin.com/aANkPUWk