2016-07-20 8 views
1

私はSpring Integrationの新機能であり、Stack Overflowの新機能です。私はSpring Integrationを理解する上で、リクエスト・リプライ・パターンに関連する助けを求めています。 Web上の読書から、私はこのタイプのユースケースを可能にするためにService Activatorを使用するべきだと考えています。春の統合 - リクエストの返信の実装

私はXMLベースのメッセージの送受信を容易にするためにJMSを使用しています。私たちの下線の実装は、IBM Websphere MQです。

また、私はSpringブート(バージョン1.3.6.RELEASE)を使用しており、純粋な注釈ベースの設定方法を使用しようとしています(可能な場合)。私はウェブを検索し、いくつかの例を見ていますが、これまでに私が見ることができるものは何もわかりません。 Spring Integrationのドキュメントは優れていますが、私はまだすべての部分がどのように適合しているかと苦労しています。私が逃したことがあるものがあれば、事前にお詫びします。私は最後の選択肢として投稿しています。

package com.daluga.spring.integration.service 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.integration.annotation.ServiceActivator; 
import org.springframework.stereotype.Service; 


@Service 
public class MyRequestReplyService { 

    private static final Logger LOGGER = LoggerFactory.getLogger(MyRequestReplyService.class); 

    @ServiceActivator(inputChannel = "replyChannel") 
    public void sendAndReceive(String requestPayload) { 
     // How to get replyPayload 
    } 

} 

ので、この時点で、私はこのすべてを接着する方法が非常に確認していない:

package com.daluga.spring.integration.configuration 

import com.ibm.mq.jms.MQConnectionFactory; 
import com.ibm.mq.jms.MQQueue; 
import com.ibm.msg.client.wmq.WMQConstants; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.integration.annotation.InboundChannelAdapter; 
import org.springframework.integration.annotation.IntegrationComponentScan; 
import org.springframework.integration.annotation.Poller; 
import org.springframework.integration.channel.QueueChannel; 
import org.springframework.integration.config.EnableIntegration; 
import org.springframework.jms.annotation.EnableJms; 
import org.springframework.jms.connection.CachingConnectionFactory; 
import org.springframework.jms.core.JmsTemplate; 

import javax.jms.ConnectionFactory; 
import javax.jms.DeliveryMode; 
import javax.jms.Destination; 
import javax.jms.JMSException; 

//import com.ibm.msg.client.services.Trace; 

@Configuration 
public class MQConfiguration { 

    private static final Logger LOGGER = LoggerFactory.getLogger(MQConfiguration.class); 

    @Value("${host-name}") 
    private String hostName; 

    @Value("${port}") 
    private int port; 

    @Value("${channel}") 
    private String channel; 

    @Value("${time-to-live}") 
    private int timeToLive; 

    @Autowired 
    @Qualifier("MQConnectionFactory") 
    ConnectionFactory connectionFactory; 

    @Bean(name = "jmsTemplate") 
    public JmsTemplate provideJmsTemplate() { 
     JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory); 
     jmsTemplate.setExplicitQosEnabled(true); 
     jmsTemplate.setTimeToLive(timeToLive); 
     jmsTemplate.setDeliveryMode(DeliveryMode.NON_PERSISTENT);  
     return jmsTemplate; 
    } 

    @Bean(name = "MQConnectionFactory") 
    public ConnectionFactory connectionFactory() { 
     CachingConnectionFactory ccf = new CachingConnectionFactory(); 

     //Trace.setOn(); 

     try { 
      MQConnectionFactory mqcf = new MQConnectionFactory(); 
      mqcf.setHostName(hostName); 
      mqcf.setPort(port); 
      mqcf.setChannel(channel); 
      mqcf.setTransportType(WMQConstants.WMQ_CM_CLIENT); 
      ccf.setTargetConnectionFactory(mqcf); 
      ccf.setSessionCacheSize(2); 
     } catch (JMSException e) { 
      throw new RuntimeException(e); 
     } 

     return ccf; 
    } 

    @Bean(name = "requestQueue") 
    public Destination createRequestQueue() { 

     Destination queue = null; 

     try { 
      queue = new MQQueue("REQUEST.QUEUE"); 
     } catch (JMSException e) { 
      throw new RuntimeException(e); 
     } 

     return queue; 
    } 

    @Bean(name = "replyQueue") 
    public Destination createReplyQueue() { 

     Destination queue = null; 

     try { 
      queue = new MQQueue("REPLY.QUEUE"); 
     } catch (JMSException e) { 
      throw new RuntimeException(e); 
     } 

     return queue; 
    } 

    @Bean(name = "requestChannel") 
    public QueueChannel createRequestChannel() { 

     QueueChannel channel = new QueueChannel(); 

     return channel; 
    } 

    @Bean(name = "replyChannel") 
    public QueueChannel createReplyChannel() { 

     QueueChannel channel = new QueueChannel(); 

     return channel; 
    } 

} 

そして、ここでは私のサービスクラスである:ここで

は、私は私の設定のために持っているものです一緒にこの仕事をする。私は、すべての仕事をするために、サービスアクティベータに要求と応答キューをどのように接着するのか理解していません。

私が呼び出しているサービス(JMS/Webshere MQベース)は、典型的なメッセージと相関IDを使用しているため、対応する応答に要求を適切に結びつけることができます。

これを動作させる方法に関するガイダンスはありますか?これを明確にするために私が提供できる追加情報をお知らせください。

ご協力いただきありがとうございます。

ダン

答えて

1

ゲートウェイは、要求/応答のセマンティクスを提供します。

JmsTemplateを直接使用する代わりに、Spring Integration's built-in JMS Supportを使用する必要があります。

@Bean 
@ServiceActivator(inputChannel="requestChannel") 
public MessageHandler jmsOutGateway() { 
    JmsOutboundGateway outGateway = new JmsOutboundGateway(); 
    // set properties 
    outGateway.setOutputChannel(replyChannel()); 
    return outGateway; 
} 

あなたは、独自のロールサービスアクチベーター方法に復帰応答タイプを変更し、テンプレートsendAndReceive()またはconvertSendAndReceive()のいずれかの方法を使用したい場合。

sample appはXML設定を使用しますが、いくつかの追加のガイダンスを提供する必要があります。

+0

ありがとう、ゲーリー!それが助けになった。私は一歩踏み出し、XMLベースの設定を使うことに決めました。私はインバウンドとアウトバウンドのゲートウェイを設定しており、メッセージコンシューマーが自分の返信キューに作成されていることがわかります。起動時にエラーはありません。応答キューに(JMSユーティリティを使用して)メッセージを置くことができ、取得されたことを確認できます。しかし、私がまだ理解していないことは、Service Activatorを介して要求キューへの呼び出しを開始する方法です。私はクラスを作成し、ServiceEctivatorを使ってMessageEndpointとそのクラスのメソッドに注釈を付けました。私はそれからmainメソッドで呼び出します。 –

+1

'RequestChannel()'を 'DirectChannel'に変更し、それに直接か、[Messaging Gateway](http://docs.spring.io/spring-integration/reference/html)を介して' Message 'を送ります。 /messaging-endpoints-chapter.html#gateway)。一般に、メッセージングインフラストラクチャと直接対話するユーザーコードではなく、後者をお勧めします。サンプルアプリケーションを見てみましょう。 –

+0

ゲイリー、ガイダンスのおかげで!私はそれをすべて繋げて働かせることができました。何が起こっているのか理解できたら、これを簡単に配線するのは簡単です。ダンテ、気をつけて。 –

関連する問題