복붙노트

[SPRING] JNDI와 Spring을 사용하여 WildFly 10.1.0. Final ActiveMQ Artemis에 어떻게 연결합니까?

SPRING

JNDI와 Spring을 사용하여 WildFly 10.1.0. Final ActiveMQ Artemis에 어떻게 연결합니까?

WildFly 10.1.0이 있습니다. 최종, Artemis 1.1.0이 있습니다. jndi.properties를 구성하는 올바른 방법은 무엇입니까?

java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=http-remoting://127.0.0.1:8080
jboss.naming.client.ejb.context=false

HornetQ가있는 WildFly 9.0.0의 최종 작업

java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=http-remoting://127.0.0.1:8080
jboss.naming.client.ejb.context=false

Spring 4.3.2, Spring-jms를 사용하고 있으며 Maven POM.xml에 wildfly-jms-client-bom을 포함 시켰습니다. 다음은 내 연결 팩토리입니다. Whith Wildfly 9 InitialContext.doLookup (..)과이 작업을 시도합니다. 그러나 WildFly 10에서는 동일한 방식으로 작동하지 않습니다.

내 주요 구성 파일은 다음과 같습니다.

@Configuration
@ComponentScan(basePackages = "org")
@Import({
    MessagingConfiguration.class,
    MessagingListenerConfiguration.class

    })
public class AppConfig {

    //Put Other Application configuration here.


}

.

package org.jms.configuration;
@Configuration
public class MessagingConfiguration {

@Bean
public ConnectionFactory connectionFactory() throws NamingException{

    ConnectionFactory connectionFactory = InitialContext.doLookup("java:/ConnectionFactory");
    return connectionFactory;
}

/*
@Bean
public JmsTemplate jmsTemplate() throws NamingException {
    JmsTemplate template = new JmsTemplate();
    template.setConnectionFactory(connectionFactory());
    //template.setDefaultDestinationName(ORDER_RESPONSE_QUEUE);
    return template;
}
*/

}

그리고 나는 다음을 가지고 있습니다 :

package org.jms.configuration;
@Configuration
@EnableJms
public class MessagingListenerConfiguration {

    @Autowired
    ConnectionFactory connectionFactory;


    public MessagingListenerConfiguration() {
        System.out.println("MessagingListenerConfiguration::Constructor!!");
    }

    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {

        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();

        factory.setConnectionFactory(connectionFactory);

        factory.setConcurrency("1-1");

        return factory;
    }
}

마지막으로이 청취자가 있습니다.

package org.jms.messaging;

import javax.jms.JMSException;

import org.gasmart.jms.model.Product;
import org.gasmart.jms.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Component;

@Component
public class MessageReceiver {

    //private static final String ORDER_QUEUE = "order-queue";

    /*
    *   <jms-queue name="shatTopic" entries="java:/jms/queue/shat java:/jboss/exported/jms/queue/shat"/>
    */
    private static final String ORDER_QUEUE = "shat";

    public MessageReceiver() {
        System.out.println(">>>>>>>>>>>>>>>>>>> OK");
    }

    @Autowired
    OrderService orderService;


    @JmsListener(destination = ORDER_QUEUE)
    public void receiveMessage(final Message<String> message) {

        MessageHeaders headers =  message.getHeaders();

        System.out.println("MessageReceiver::receiveMessage(product)   Application : headers received : "+headers);

        //orderService.processOrder(product);


    }

}

이 오류가 발생합니다.

20 : 04 : 42,971 WARN [org.springframework.jms.listener.DefaultMessageListenerContainer] (DefaultMessageListenerContainer-124) 대상 'shat'에 대한 JMS 메시지 리스너 호출자의 설정에 실패했습니다. 복구하려고합니다. 원인 : 이름이 shat 인 큐가 없습니다.

20 : 04 : 42,971 정보 [org.springframework.jms.listener.DefaultMessageListenerContainer] (DefaultMessageListenerContainer-124) JMS 연결이 성공적으로 갱신되었습니다

Shat 큐는 MessageReceiver 클래스에 선언되어 있습니다. 내 standalone-full.xml은 다음입니다.

<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
            <server name="default">
                <security-setting name="#">
                    <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/>
                </security-setting>
                <security-setting name="jms.topic.chat">
                    <role name="guest2" send="true" consume="true" create-non-durable-queue="true"/>
                </security-setting>
                <address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
                <http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/>
                <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput">
                    <param name="batch-delay" value="50"/>
                </http-connector>
                <in-vm-connector name="in-vm" server-id="0"/>
                <http-acceptor name="http-acceptor" http-listener="default"/>
                <http-acceptor name="http-acceptor-throughput" http-listener="default">
                    <param name="batch-delay" value="50"/>
                    <param name="direct-deliver" value="false"/>
                </http-acceptor>
                <remote-acceptor name="websocket-stomp" socket-binding="netty-ws"/>
                <in-vm-acceptor name="in-vm" server-id="0"/>
                <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
                <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
                <jms-queue name="shatTopic" entries="java:/jms/queue/shat java:/jboss/exported/jms/queue/shat"/>
                <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
                <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
                <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa"/>
            </server>
        </subsystem>

대기열을 정의했으며 올바르게 정의되었습니다.

큐 선언 방법에 대한 참조는 여기를 참조하십시오. http://www.mastertheboss.com/jboss-server/jboss-jms/jboss-jms-configuration

왜 연결할 수 없습니까? 이해가 안 돼요 나는 실제로 많은 방법을 시도했지만 작동하지 않습니다.

업데이트 : 2016 년 8 월 29 일-오전 10시

응용 프로그램을로드 한 후 실제로 배포 된 응용 프로그램으로 모든 wildfly를 다시 시작하면 클라이언트를 연결하는 경우 (STOMP를 통해 Websocket을 사용하여 "jms.queue.shat"대기열에 직접 메시지를 생성하는 웹 클라이언트가 있습니다. stomp.js) 메시지를 보내면 응용 프로그램 (java)이 메시지를 올바르게 소비합니다. 그러나 응용 프로그램이 올바르게 작동 한 후 응용 프로그램을 재배치하면 오류가 발생합니다. 다음은 오류입니다.

10:43:51,607 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool - 113) WFLYUT0021: Registered web context: /ServerApp
10:43:51,632 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) WFLYSRV0010: Deployed "ServApp.war" (runtime-name : "ServApp.war")
10:43:56,588 INFO  [org.springframework.jms.listener.DefaultMessageListenerContainer] (DefaultMessageListenerContainer-2) JMS message listener invoker needs to establish shared Connection
10:43:56,592 ERROR [org.springframework.jms.listener.DefaultMessageListenerContainer] (DefaultMessageListenerContainer-2) Could not refresh JMS Connection for destination 'shat' - retrying using FixedBackOff{interval=5000, currentAttempts=0, maxAttempts=unlimited}. Cause: Failed to create session factory; nested exception is java.lang.IllegalStateException: Server locator is closed (maybe it was garbage collected)
10:44:01,592 ERROR [org.springframework.jms.listener.DefaultMessageListenerContainer] (DefaultMessageListenerContainer-2) Could not refresh JMS Connection for destination 'shat' - retrying using FixedBackOff{interval=5000, currentAttempts=1, maxAttempts=unlimited}. Cause: Failed to create session factory; nested exception is java.lang.IllegalStateException: Server locator is closed (maybe it was garbage collected)
10:44:06,593 ERROR [org.springframework.jms.listener.DefaultMessageListenerContainer] (DefaultMessageListenerContainer-2) Could not refresh JMS Connection for destination 'shat' - retrying using FixedBackOff{interval=5000, currentAttempts=2, maxAttempts=unlimited}. Cause: Failed to create session factory; nested exception is java.lang.IllegalStateException: Server locator is closed (maybe it was garbage collected)

.....

오류 : JMS 메시지 리스너 호출자가 공유 연결을 설정해야합니다. 대상 'shat'에 대한 JMS 연결을 새로 고칠 수 없습니다 ... 서버 로케이터가 닫혔습니다 (가비지 수집되었을 수 있음).

ActiveMQ Artemis artemis 1.1.0.wildfly-017의 버그 일 수 있습니까?

일부는 비슷한 것을 해결 했습니까?

업데이트 : 2016-08-29-14:00 P.M.

누군가 관심이 있다면 ... JndiObjectFactoryBean을 사용하여 JNDI 객체 (이 경우 JMS 연결 팩토리)를 조회하면 이전 문제가 사라진다는 것을 알았습니다. 일반적으로 JndiObjectFactoryBean을 사용하여 예제를 찾았지만 데이터베이스 데이터 소스를 가져 오기 위해 JMS 연결 팩토리를 얻는 예제는 거의 없습니다.

메시징 구성 클래스 변경 :

@Bean
public ConnectionFactory connectionFactory() throws NamingException{

    ConnectionFactory connectionFactory = InitialContext.doLookup("java:/ConnectionFactory");
    return connectionFactory;
}

@Bean
public ConnectionFactory connectionFactory() throws NamingException{
    return ConnectionFactory connectionFactory = InitialContext.doLookup("java:/ConnectionFactory");
}

와:

 @Bean
public JndiObjectFactoryBean solicitudesConnectionFactory() {
    JndiObjectFactoryBean jndi = new JndiObjectFactoryBean();
    jndi.setJndiName("java:/ConnectionFactory");
    jndi.setLookupOnStartup(true);
    jndi.setProxyInterface(ConnectionFactory.class);
    return jndi;
}

public ConnectionFactory notificacionesConnectionFactory() {
    return  new  SingleConnectionFactory((ConnectionFactory)solicitudesConnectionFactory().getObject());
}

응용 프로그램을 재배치하면 Artemis와의 연결도 올바르게 작동합니다. 그러나 jndi.properties 파일은 더 이상 사용되지 않으며 "서버 로케이터가 닫혔습니다"문제가 사라집니다.

JndiObjectFactoryBean이 올바른지 모르겠지만 jndi.properties 파일을 계속 사용하고 싶습니다. 어떻게합니까 ??

해결법

  1. ==============================

    1.ORDER_QUEUE를 shat에서 java : / jms / queue / shat으로 변경하십시오.

    ORDER_QUEUE를 shat에서 java : / jms / queue / shat으로 변경하십시오.

  2. from https://stackoverflow.com/questions/39177437/how-connect-to-wildfly-10-1-0-final-activemq-artemis-using-jndi-and-spring by cc-by-sa and MIT license