2016-11-14 3 views
0

私のプロジェクトでは、スプリング統合を使用してキューを実装しています。ヘッダー・バリュー・ルータの設定は以下のようにXMLである:SpringインテグレーションでjmsまたはactivemqのHeaderValueRouterおよびHeaderEnricherを呼び出す方法

<header-value-router input-channel="jmsUVMasterMessageChannel" 
    header-name="METADATA_TYPE" default-output-channel="nullChannel" 
    resolution-required="false"> 
    <mapping value="ASSEMBLY" channel="downloadImageToS3Channel" /> 
    <mapping value="THIRDPARTY" channel="invokeUVMasterAPIChannel" /> 
</header-value-router> 

<header-enricher input-channel="JuiceVendorMessageChannel" 
    output-channel="JuiceHeaderEnricherChannel"> 
    <header name="sourceName" value="JUICE" /> 
</header-enricher> 

そしてここでは、ゲートウェイの設定です:

私は、Javaコードでこの設定を実装する方法を知りたいですか?私はGoogleで検索し、次のコードが見つかりました:

@Bean 
public HeaderValueRouter headerRouter(String gatewayPrefix) { 
    HeaderValueRouter router = new HeaderValueRouter("METADATA_TYPE"); 
    router.setChannelMapping("ASSEMBLY", "downloadImageToS3Channel"); 
    router.setChannelMapping("THIRDPARTY", "invokeUVMasterAPIChannel"); 
    router.setDefaultOutputChannel(new NullChannel()); 
    router.setResolutionRequired(false); 
    return router; 
} 

@Bean 
@Transformer(inputChannel="sdiVenderMessageChannel", outputChannel="sdiHeaderEnricherChannel") 
public HeaderEnricher enrichHeaders() { 
    Map<String, HeaderValueMessageProcessor<?>> headersToAdd = new HashMap<String, HeaderValueMessageProcessor<?>>(); 
    // TODO 
    //headersToAdd.put("sourceName",new StaticHeaderValueMessageProcessor<String>("SDI")); 
    headersToAdd.put("sourceName", null); 
    HeaderEnricher enricher = new HeaderEnricher(headersToAdd); 
    if(logger.isDebugEnabled()){ 
     logger.debug("HeaderEnricher bean initial!"); 
    } 
    return enricher; 
} 

しかし、ここでは、私の質問は以下のとおりです。

1)Javaの設定で「入力チャンネル」を設定へどのように?

2)どこでこの関数を呼び出す必要がありますか?アプリケーションを起動すると、この関数にコードが実行されません。私はheaderValueRouterがメッセージを入力チャネルから出力チャネルにディスパッチするのに使われていることを知っていますが、私はこのルータを呼び出すことができる正確な場所は何ですか? ConnectionFactoryまたはListenerContainerでここ

そして、私が定義されたゲートウェイです:

public void registerDynamicInboundGateway(DefaultListableBeanFactory beanFactory) { 
    this.beanFactory = beanFactory; 

    BeanDefinitionBuilder builder = BeanDefinitionBuilder 
      .genericBeanDefinition("org.springframework.integration.jms.JmsMessageDrivenEndpoint"); 
    String jndiFactoryName = this.registerJndiObjectFactoryBean(gatewayPrefix, jmsQueueValue); 
    this.destination = jndiFactoryName; 
    String containerBeanName = this.registerMessageListenerContainer(); 
    String listenerBeanName = this.registerMessageListener(); 
    builder.addConstructorArgReference(containerBeanName); 
    builder.addConstructorArgReference(listenerBeanName); 
    setValueIfAttributeDefined(builder, autoStartup, "auto-startup"); 

    String beanName = null; 
    if(gatewayPrefix.equals(HCC_GATEWAY_PREFIX)){ 
     beanName = gatewayPrefix + DynamicInboundGateway.HCC_GATEWAY_SUFIX; 
    } else if (gatewayPrefix.equals(UVMASTER_GATEWAY_PREFIX)) { 
     beanName = gatewayPrefix + DynamicInboundGateway.UVMASTER_GATEWAY_PREFIX; 
    } else { 
     beanName = gatewayPrefix + DynamicInboundGateway.GATEWAY_SUFIX; 
    } 

    this.beanFactory.registerBeanDefinition(
      beanName, builder.getBeanDefinition()); 
} 

私は混乱して感じたし、このための任意のサンプルコードが見つかりませんでした。 ありがとう!

私は以下のように、ばねの統合ウェブサイトのサンプルコードに応じHeaderEnricherを定義します。

@Bean 
@Transformer(inputChannel="sdiVenderMessageChannel", outputChannel="sdiHeaderEnricherChannel") 
public HeaderEnricher enrichHeaders() { 
    Map<String, HeaderValueMessageProcessor<?>> headersToAdd = new HashMap<String, HeaderValueMessageProcessor<?>>(); 
    // TODO 
    headersToAdd.put("sourceName",new StaticHeaderValueMessageProcessor<String>("SDI")); 
    //headersToAdd.put("sourceName", null); 
    HeaderEnricher enricher = new HeaderEnricher(headersToAdd); 
    if(logger.isDebugEnabled()){ 
     logger.debug("HeaderEnricher bean initial!"); 
    } 
    return enricher; 
} 

そして、これは、いくつかのエラーが発生しました:

StaticHeaderValueMessageProcessor cannot be resolved to a type 

しかし、私はすべてインポートしました必要なパッケージはmavenと一緒に必要です。なぜ私は理解できません。

答えて

0

うまくいけば、このシンプルな春のブートアプリは...物事が明確になります

@SpringBootApplication 
public class So40585409Application { 

    public static void main(String[] args) throws Exception { 
     ConfigurableApplicationContext context = SpringApplication.run(So40585409Application.class, args); 
     JmsTemplate template = context.getBean(JmsTemplate.class); 
     template.convertAndSend("foo", "message1", m -> { 
      m.setStringProperty("foo", "bar"); 
      return m; 
     }); 
     template.convertAndSend("foo", "message2", m -> { 
      m.setStringProperty("foo", "baz"); 
      return m; 
     }); 
     Thread.sleep(5000); 
     context.close(); 
    } 

    @Bean 
    public JmsMessageDrivenEndpoint inbound(ConnectionFactory jmsConnectionFactory) { 
     return new JmsMessageDrivenEndpoint(container(jmsConnectionFactory), listener()); 
    } 

    @Bean 
    public DefaultMessageListenerContainer container(ConnectionFactory jmsConnectionFactory) { 
     DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); 
     container.setConnectionFactory(jmsConnectionFactory); 
     container.setDestinationName("foo"); 
     return container; 
    } 

    @Bean 
    public ChannelPublishingJmsMessageListener listener() { 
     ChannelPublishingJmsMessageListener listener = new ChannelPublishingJmsMessageListener(); 
     listener.setRequestChannelName("toRouter"); 
     return listener; 
    } 

    @Bean 
    @Router(inputChannel="toRouter") 
    public HeaderValueRouter router() { 
     HeaderValueRouter router = new HeaderValueRouter("foo"); 
     router.setChannelMapping("bar", "barChannel"); 
     router.setChannelMapping("baz", "bazChannel"); 
     return router; 
    } 

    @ServiceActivator(inputChannel = "barChannel") 
    public void bar(String in) { 
     System.out.println("Received via barChannel: " + in); 
    } 

    @ServiceActivator(inputChannel = "bazChannel") 
    public void baz(String in) { 
     System.out.println("Received via bazChannel: " + in); 
    } 

} 

結果:

2016-11-14 09:17:56.798 INFO 65082 --- [   main] com.example.So40585409Application  : Started So40585409Application in 8.842 seconds (JVM running for 10.819) 
Received via barChannel: message1 
Received via bazChannel: message2 
2016-11-14 09:18:02.038 INFO 65082 --- [   main] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.conte[email protected]: startup date [Mon Nov 14 09:17:49 EST 2016]; root of context hierarchy 

EDIT - ヘッダーEnricher

私はちょうどであなたの豆を追加しました問題ありません...

@ServiceActivator(inputChannel = "barChannel2") 
    public void bar(String in, @Header("sourceName") String sourceName) { 
     System.out.println("Received via barChannel: " + in + " " + sourceName); 
    } 

    @ServiceActivator(inputChannel = "bazChannel") 
    public void baz(String in) { 
     System.out.println("Received via bazChannel: " + in); 
    } 

    @Bean 
    @Transformer(inputChannel = "barChannel", outputChannel = "barChannel2") 
    public HeaderEnricher enrichHeaders() { 
     Map<String, HeaderValueMessageProcessor<?>> headersToAdd = new HashMap<String, HeaderValueMessageProcessor<?>>(); 
     headersToAdd.put("sourceName", new StaticHeaderValueMessageProcessor<String>("SDI")); 
     HeaderEnricher enricher = new HeaderEnricher(headersToAdd); 
     return enricher; 
    } 

結果:

2016-11-15 09:00:48.383 INFO 50137 --- [   main] com.example.So40585409Application  : Started So40585409Application in 1.814 seconds (JVM running for 2.528) 
Received via barChannel: message1 SDI 
Received via bazChannel: message2 
2016-11-15 09:00:53.424 INFO 50137 --- [   main] s.c.a.AnnotationConfigApplicationContext : Closing org.spring[email protected]2c34f934: startup date [Tue Nov 15 09:00:46 EST 2016]; root of context hierarchy 
+0

どうもありがとう!それは本当に物事をはっきりとさせる。しかしもう1つの質問ですが、私がHeaderEnricherを定義したときに私の質問が更新されました。これに気をつけてください。再度、感謝します。 – nasuf

+0

あなたのBeanを問題なくテストケース(編集を参照)に追加しました。もちろん、Spring Integration 3.0以降で利用可能だった 'import org.springframework.integration.transformer.support.StaticHeaderValueMessageProcessor; 'が必要です。 –

+0

ありがとうございました。私はXMLでそれを設定し、それは働いた – nasuf

関連する問題