我正在尝试向Hazelcast缓存添加事务支持。为了做到这一点,我发现Hazelcast有一个jca-rar,它给了我一个我可以使用的连接。这是我到目前为止所做的:
.rar
文件放入我的WEB-INF/lib
文件夹中。 tomee.unpack.dir = work/
文件中设置system.properties
。我的pom.xml
文件:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>cachetest</artifactId>
<version>0.0.1</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hazelcast.version>3.6.2</hazelcast.version>
</properties>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.5</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<archive>
<manifestEntries>
<Dependencies>com.hazelcast</Dependencies>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>${hazelcast.version}</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-jca</artifactId>
<version>${hazelcast.version}</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-jca-rar</artifactId>
<version>${hazelcast.version}</version>
<type>rar</type>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
我为测试目的添加了一个休息服务。
@Path("resttest")
@Stateless
public class RestService {
@Resource(mappedName = "hazelcast-jca-rar-3.6.2RA")
private ConnectionFactory connectionFactory;
@GET
@Path("create")
public void createGame() throws ResourceException {
connectionFactory.getConnection();//ClassCastException
}
}
我的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<display-name>Cachetest</display-name>
<session-config>
<session-timeout>90</session-timeout>
</session-config>
</web-app>
我的tomee.xml:
<?xml version="1.0" encoding="UTF-8"?>
<tomee>
<Deployments dir="apps" />
</tomee>
这实际上是我在简单测试中使用的所有代码,并且在尝试从连接工厂获取ClassCassException
的连接时失败:
INFO: HZ Connection Event <<FACTORY_INIT>> for hazelcast.ManagedConnectionFactoryImpl [1] in thread [http-bio-8080-exec-7]
java.lang.Exception: Hz Connection Event Call Stack
at com.hazelcast.jca.ManagedConnectionFactoryImpl.logHzConnectionEvent(ManagedConnectionFactoryImpl.java:167)
at com.hazelcast.jca.ManagedConnectionFactoryImpl.createConnectionFactory(ManagedConnectionFactoryImpl.java:91)
at com.hazelcast.jca.ManagedConnectionFactoryImpl.createConnectionFactory(ManagedConnectionFactoryImpl.java:44)
at org.apache.openejb.core.ConnectorReference.getObject(ConnectorReference.java:50)
at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:175)
...
SEVERE: EjbTransactionUtil.handleSystemException: com.sun.proxy.$Proxy114 cannot be cast to com.hazelcast.jca.HazelcastConnectionImpl
java.lang.ClassCastException: com.sun.proxy.$Proxy114 cannot be cast to com.hazelcast.jca.HazelcastConnectionImpl
at com.hazelcast.jca.ConnectionFactoryImpl.getConnection(ConnectionFactoryImpl.java:89)
at com.hazelcast.jca.ConnectionFactoryImpl.getConnection(ConnectionFactoryImpl.java:79)
at com.hazelcast.jca.ConnectionFactoryImpl.getConnection(ConnectionFactoryImpl.java:36)
有谁知道为什么会这样?我是否会错过某种配置?
我的TomEE versjon i 1.7.4和hazelcast versjon 3.6.2(用pom写的)。
答案 0 :(得分:1)
这很糟糕。简而言之:你遇到了麻烦。
错误描述非常清楚:JDK动态代理无法转换为类。这是一种预期的行为,因为JDK Proxies只能实现接口。这是一个特定于TomEE的问题,因为大多数主要的应用服务器供应商都使用具有类支持的自定义代理技术(JBoss Javassist,Spring CGLIB等),而TomEE则坚持使用JDK代理。 TomEE有点承认这个问题,但他们表示“不太可能很快得到解决”。有关详细信息,请参阅there。
Hazelcast失败的原因是他们将连接对象转换为实现,而不是接口(请参阅source)。对于内部代码,这种行为没有任何罪恶,但有时它并不会派上用场。
现在,到实际部分。我认为没有任何可能通过“配置”修复它。如果您已准备好修补Hazelcast RA,那么您可以使用基于接口的类替换类或使用DissociatableManagedConnection,在这种情况下有人提到它很方便。
public class HazelcastManagedConnectionImpl extends JcaBase
implements ManagedConnection, LocalTransaction,
LocalTransaction, DissociatableManagedConnection {
@Override
public void dissociateConnections() throws ResourceException {
conn = null;
}
...
}
但实际上,我建议您重新考虑应用程序服务器的选择。 TomEE的市场份额很小,并非没有理由:它几乎所有东西都使用它自己的容器,这使得开发人员更难以将其保持在最新状态。 Wildfly可能是一个不错的选择(至少,第9版非常稳定,我的资源适配器在其中运行良好)。
答案 1 :(得分:0)
打开了有关该https://github.com/hazelcast/hazelcast-ra/issues/3的问题。修复淡褐色方面是微不足道的,所以希望情况会如此。
编辑:修复已整合