2013-04-05 4 views
0

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에 연결하는 내 위의 코드를 얻기의 방법으로 도와 주실 수 있습니다.

답변

1

직접 연결 팩토리를 사용하십시오. 그것은 나를 위해 일한 :

스프링 빈 (5445이 hornetq 수용체 포트) : (hornetq 코어 클라이언트에서 hornetq - JMS 클라이언트와 TransportConfiguration에서 HornetQJMSConnectionFactory 사용)

<bean name="jmsConnectionFactory" class="messaging.jms.CustomHornetQJMSConnectionFactory"> 
    <constructor-arg name="ha" value="false" /> <!-- set true if you want support failover --> 
    <constructor-arg name="commaSepratedServerUrls" value="127.0.0.1:5445" /> 
    <property name="username" value="admin" /> 
    <property name="password" value="admin" /> 
</bean> 

연결 팩토리의 구현 : 당신이 JmsTemplate이 연결 팩토리를 주면

public class CustomHornetQJMSConnectionFactory extends org.hornetq.jms.client.HornetQJMSConnectionFactory 
{ 
    private static final long serialVersionUID = 1L; 

    private String username; 
    private String password; 

    public CustomHornetQJMSConnectionFactory(boolean ha, String commaSepratedServerUrls) 
    { 
     super(ha, converToTransportConfigurations(commaSepratedServerUrls)); 
    } 

    public static TransportConfiguration[] converToTransportConfigurations(String commaSepratedServerUrls) 
    { 
     String [] serverUrls = commaSepratedServerUrls.split(","); 
     TransportConfiguration[] transportconfigurations = new TransportConfiguration[serverUrls.length]; 
     for(int i = 0; i < serverUrls.length; i++) 
     { 
      String[] urlParts = serverUrls[i].split(":"); 
      HashMap<String, Object> map = new HashMap<String,Object>(); 
      map.put(TransportConstants.HOST_PROP_NAME, urlParts[0]); 
      map.put(TransportConstants.PORT_PROP_NAME, urlParts[1]); 
      transportconfigurations[i] = new TransportConfiguration(NettyConnectorFactory.class.getName(), map); 
     } 
     return transportconfigurations; 
    } 

    @Override 
    public Connection createConnection() throws JMSException 
    { 
     return super.createConnection(username, password); 
    } 
    public String getUsername() { 
     return username; 
    } 
    public void setUsername(String username) { 
     this.username = username; 
    } 
    public String getPassword() { 
     return password; 
    } 
    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

이제, 당신은 메시지

송신/소모에 대한 통과/사용자가 사용할 수 있습니다