2017-11-09 9 views
0

インスタンス変数を使用してBeanを初期化しようとしています。だから私は、queueNameとmessageListener与えられたキューを作成するための情報を含む基本クラスがあります。スプリングブート。インスタンス変数を使用したBeansの初期化

豆が初期化されていません。誰かが私のコードを見て助けてくれますか?他のクラスがコードの二重性を減らすために使用できるクラスを作成しようとしました。そのため、インスタンス変数を使用してBeanを作成しています。

//class Application 

package com.ats.myntra; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class); 
    } 
} 








//class RabbitMqQueue 

import javax.annotation.PostConstruct; 

import org.springframework.amqp.core.MessageListener; 
import org.springframework.amqp.core.Queue; 
import org.springframework.amqp.rabbit.connection.ConnectionFactory; 
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; 
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class RabbitMqQueue { 
    private String queue; 
    private MessageListener messageListener; 

    public RabbitMqQueue(String queue, MessageListener messageListener){ 
     this.queue = queue; 
     this.messageListener = messageListener; 
    } 

    @Bean 
    MessageListenerAdapter listenerAdapter() { 
     return new MessageListenerAdapter(messageListener, "onMessage"); 
    } 

    @PostConstruct 
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) { 
     SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
     container.setConnectionFactory(connectionFactory); 
     container.setQueueNames(queue); 
     container.setMessageListener(messageListener); 
     return container; 
    } 

    @Bean 
    Queue queue() { 
     return new Queue(queue, false); 
    } 

} 





//class q1 
package Configuration; 


import org.springframework.amqp.core.Message; 
import org.springframework.amqp.core.MessageListener; 
import org.springframework.stereotype.Component; 

@Component 
public class q1 implements MessageListener{ 

    q1 q = new q1(); 
    String queue = "abcd"; 


    RabbitMqQueue rabbitMqQueue = new RabbitMqQueue(queue,q); 


    static void print(){ 
     System.out.println("why"); 
    } 

    //rabbitMqQueue = 
    @Override 
    public void onMessage(Message message) { 
     // TODO Auto-generated method stub 

    } 
} 
+0

を支援キュー。したがって、将来キューを追加する必要がある場合は、このクラスを変更する必要はありません。 – user1973987

答えて

0

設定クラスに問題があります。これらの値にコンストラクタインジェクションを使用せず、フィールドに直接注入するだけです。私はあなたの設定ファイルに "queue.name"という名前のプロパティを持っていると仮定してあなたの例を修正しましたが、これはあなたが使っているものに変更することができます。

@Configuration 
public class RabbitMqQueue { 

    @Value("${queue.name}") 
    private String queue; 

    @Autowired 
    private MessageListener messageListener; 

    @Bean 
    MessageListenerAdapter listenerAdapter() { 
     return new MessageListenerAdapter(messageListener, "onMessage"); 
    } 

    @PostConstruct 
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) { 
     SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
     container.setConnectionFactory(connectionFactory); 
     container.setQueueNames(queue); 
     container.setMessageListener(messageListener); 
     return container; 
    } 

    @Bean 
    Queue queue() { 
     return new Queue(queue, false); 
    } 

} 

またはその代わりに、あなたが実際にちょうどこのようなビーンファクトリメソッドに値を挿入することができます

//snip 
    @Bean 
    @Autowired 
    MessageListenerAdapter listenerAdapter(private MessageListener messageListener) { 
     return new MessageListenerAdapter(messageListener, "onMessage"); 
    } 
//snip 
    @Bean 
    Queue queue(@Value("${queue.name}" String queueName){ 

     return new Queue(queue, false); 
    }  
//snip 

希望私はどんなことでこのRabbitMqQueueクラスは、再利用可能なようにしたい:)

+0

私は、messageListenerをautowireしたくありません。さもなければ私のRabbitMqQueueは他のキューによって再利用可能なままになりません。 – user1973987

+0

私はRabbitMqにはあまり馴染んでいないので、私はあなたの言葉を払わなければなりません。まだ(自分の学習目的のために)、なぜ再利用できないでしょうか?また、 "@Componant"という注釈が付けられているので、既にBeanとして作成されているように見えるので、どのように注入すると問題が発生するかわかりません。スレッドセーフでない場合は、Beanであってはいけません。私が考えることができる唯一の他の方法は、値を取得するためのファクトリクラスとメソッドを作成すること、またはアダプタだけが使用するファクトリメソッド "listenerAdapter"内のリスナの新しいインスタンスを作成することです。 – Pytry

+0

私はそれを注入していますか?私は基本的にRabbitMqQueue.javaクラスを変更しています。私は何とかストラテジの設計パターンのようにコンストラクタを使って注入したいと思っています。 – user1973987

関連する問題