我正在尝试将事务性支持添加到Hazelcast缓存中。为了实现这一点,我发现Hazelcast有一个jca-rar,它给了我一个可以使用的连接工厂。这就是我到目前为止所做的:
.rar文件放到了我的WEB-INF/lib文件夹中。tomee.unpack.dir = work/文件中设置了system.properties。pom.xml文件:
4.0.0测试cachetest 0.0.1 war UTF-8 3.6.2 ${project.artifactId} org.apache.maven.plugins maven-war-plugin2.5假com.hazelcast com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider 2.4.3 com.hazelcast hazelcast ${hazelcast.version} com.hazelcast hazelcast-jca ${hazelcast.version} com.hazelcast hazelcast-jca-rar ${hazelcast.version} rar javaee 6.0提供我的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 versjonI1.7.4和hazelcast versjon3.6.2(用pom编写)。
发布于 2016-04-25 18:53:32
这很糟糕。简而言之,你有麻烦了。
错误描述非常清楚: JDK动态代理不能转换为类。这是一种预期的行为,因为JDK代理只能实现接口。这是一个特定于TomEE的问题,因为大多数主要的应用程序服务器供应商都使用具有类支持的自定义代理技术(JBoss JDK协助、Spring等),而TomEE则使用JDK代理。TomEE承认这个问题,但他们说“不太可能很快解决”。有关进一步信息,请参见那里。
Hazelcast在这里失败的原因是,他们将连接对象转换到它的implementation,,而不是接口(参见来源)。对于内部代码来说,这种行为并没有什么犯罪行为,但有时它并不有用。
现在,说到实际的部分。我看不出有任何可能“通过配置”来修复它。如果您已经准备好修补Hazelcast RA,那么您可以使用基于接口的类转换或者使用DissociatableManagedConnection,在这种情况下会提到它非常方便。
public class HazelcastManagedConnectionImpl extends JcaBase
implements ManagedConnection, LocalTransaction,
LocalTransaction, DissociatableManagedConnection {
@Override
public void dissociateConnections() throws ResourceException {
conn = null;
}
...
}但是,实际上,我建议您重新考虑应用程序服务器的选择。托梅的市场份额很小,不是没有原因:它使用自己的容器,几乎所有的东西,这使得它的开发人员很难保持在最新的状态。Wildfly可能是一个很好的选择(至少第9个版本相当稳定,我的资源适配器在其中工作得很好)。
发布于 2016-05-02 21:09:54
打开了一个关于那个https://github.com/hazelcast/hazelcast-ra/issues/3的问题。修复哈泽尔卡斯特方面是微不足道的,所以希望情况会如此。
编辑: fix已集成
https://stackoverflow.com/questions/36738742
复制相似问题