JBoss 7.1.1 및 외부 HornetQ 구현 2.2.1.4에 대해 빌드 된 Spring JMS 솔루션을 만들었습니다. 이것은 연결되어 성공적으로 작동했습니다.JBoss EAP6 + HornetQ - HornetQ에 대한 대기열 연결을 만드는 방법을 알 수 없음
그러나 지금 EAP6을 사용 중이며 EAP6 내에 패키지 된 내부 HornetQ에 연결하려고 시도하고 있습니다.
나는 연결을 관리하고 대기열을 만드는 몇 가지 클래스가 있습니다. 그러나 포장 된 HornetQ에 연결해야하는 것처럼 보이는 것은 적합하지 않습니다. 외부 HornetQ에 연결할 때 잘 작동합니다.
나는 이것을 Redhat과 함께 제기했으며, 스프링 코딩이 필요하므로이를 해결하는 방법이 확실하지 않습니다.
내가 가진 문제는 우리가 봄을 구현하는 방식이며, 우리가 봄 JmsTemplate를 사용 QueueConnection qcon = queueConnectionFactory.createQueueConnection("user","password");
에서 그러나 나는이하는 QueueConnection와를 만들 필요가 있다고 생각하고, 대기열을 추가하는 개념 이 연결을 사용할 수 없으므로 작동하지 않습니다. 이것은 내 QueueManagerImpl 코드가
package com.myproject.test.impl;
import java.util.HashMap;
import java.util.Map;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import org.hornetq.api.core.TransportConfiguration;
import org.hornetq.api.jms.HornetQJMSClient;
import org.hornetq.api.jms.JMSFactoryType;
import org.hornetq.core.remoting.impl.netty.NettyConnectorFactory;
import org.hornetq.core.remoting.impl.netty.TransportConstants;
import org.jboss.logging.Logger;
import com.myproject.test.QueueConnectionFactory;
public class QueueConnectionFactoryImpl implements QueueConnectionFactory {
private String host;
private int port;
private ConnectionFactory connectionFactory;
private Logger logger;
private boolean useJta = false;
public QueueConnectionFactoryImpl(String host, int port, boolean useJta)
{
this.useJta = useJta;
createConnection(host, port);
}
public QueueConnectionFactoryImpl(String host, int port) {
createConnection(host, port);
}
public QueueConnectionFactoryImpl(String host, int port, boolean useJta, boolean useCluster)
{
this.useJta = useJta;
if(useCluster)
createClusterConnection(host, port);
else
createConnection(host, port);
}
private void createConnection(String host, int port) {
logger = Logger.getLogger(this.getClass());
this.host = host;
this.port = port;
Map<String, Object> connectionParams = new HashMap<String, Object>();
connectionParams.put(TransportConstants.PORT_PROP_NAME, port);
connectionParams.put(TransportConstants.HOST_PROP_NAME, host);
TransportConfiguration transportConfiguration = new TransportConfiguration(NettyConnectorFactory.class.getName(), connectionParams);
JMSFactoryType jmsFType = JMSFactoryType.CF;
if(useJta)
jmsFType = JMSFactoryType.XA_CF;
connectionFactory = (ConnectionFactory) HornetQJMSClient.createConnectionFactoryWithoutHA(jmsFType, transportConfiguration);
}
private void createClusterConnection(String host, int port)
{
logger = Logger.getLogger(this.getClass());
this.host = host;
this.port = port;
JMSFactoryType jmsFType = JMSFactoryType.CF;
if(useJta)
jmsFType = JMSFactoryType.XA_CF;
connectionFactory = (ConnectionFactory) HornetQJMSClient.createConnectionFactoryWithHA(new DiscoveryGroupConfiguration(host, port), jmsFType);
}
public QueueConnectionFactoryImpl(Object connectionFactory)
{
logger = Logger.getLogger(this.getClass());
logger.debug("Object is: "+connectionFactory);
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public ConnectionFactory getConnectionFactory() {
return connectionFactory;
}
public void setConnectionFactory(ConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
public boolean isUseJta() {
return useJta;
}
public void setUseJta(boolean useJta) {
this.useJta = useJta;
}
}
입니다 : 이것은 클래스 내 QueueConnectionFactoryImpl
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="com.myproject.test" />
<task:annotation-driven />
<bean id="testTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:/TransactionManager"></property>
<property name="autodetectUserTransaction" value="false"></property>
</bean>
<tx:annotation-driven transaction-manager="testTransactionManager" />
<bean id="queueConnectionFactory" class="com.myproject.test.impl.QueueConnectionFactoryImpl">
<constructor-arg type="String" name="host" value="231.7.7.7" />
<constructor-arg type="int" name="port" value="9876" />
<constructor-arg type="boolean" name="useJta" value="true" />
<constructor-arg type="boolean" name="useCluster" value="true" />
</bean>
<bean id="testQueueManager" class="com.myproject.test.impl.QueueManagerImpl">
<constructor-arg ref="queueConnectionFactory" />
<constructor-arg name="queue" value="TestQueue" />
</bean>
</beans>
입니다 : 아래
필요한 스프링 빈을 포함하는 JMS-services.xml에 파일입니다 중요한 것은이 505,333,210는 코드 위 QueueManagerImpl JmsTemplate 내에서 전달 될 ConenctionFactory하는 오브젝트를 요구 - template.setConnectionFactory (ConnectionFactory에);
이<bean id="myConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="queueConnectionFactory"/>
<property name="username" value="myuser"/>
<property name="password" value="myuser123"/>
</bean>
이 다음과 같은 예외를 작성합니다
1)에 추가하여 JSM-service.xml 파일에 다음
나는이 작업을 얻을 수있는 몇 가지 방법을 시도했다 :
java.lang.IllegalStateException : [com.myproject.test.impl.QueueConnectionFactoryImpl] 필요한 유형 유형의 값을 변환 할 수 없습니다 [javax.jms.ConnectionFactory] 부동산 'targetConnectionFactory'에 대한 : 일치 편집자 또는 전환 전략은 QueueConnectionFactoryImpl에서 연결을 변경
2) 발견 :
org.hornetq.jms.client.HornetQConnectionFactory HQConnectionFactory = (HornetQConnectionFactory) HornetQJMSClient.createConnectionFactoryWithoutHA(jmsFType, transportConfiguration);
try {
connectionFactory = (ConnectionFactory) HQConnectionFactory.createConnection("myuser","myuser123");
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
이 중 하나가 작동하지 않습니다. 예외가 발생합니다 :
java.lang.ClassCastException : org.hornetq.jms.client.HornetQConnection을 javax.jms로 형변환 할 수 없습니다.한마디로 ConnectionFactory를
는, 아무도 내가 여전히이 JmsTemplate을 사용할 수 있도록 어떤 방법으로 사용자 이름과 암호를 제공하여 HornetQ에 연결하는 내 위의 코드를 얻기의 방법으로 도와 주실 수 있습니다.