2017-03-22 4 views
1

「状態変更」と呼ばれるAzureサービスバスのトピック設定があり、「reverb」というサブスクリプションがあります。私は、トピックにサブスクライブする@JmsListenerとメソッドを設定しようとしているが、エラーを取得しています:SpringブートとAMQPを使用したAzureサービスバストピックの購読

2017-03-22 18:34:41.049 WARN 23356 --- [enerContainer-6] o.s.j.l.DefaultMessageListenerContainer : Setup of JMS message listener invoker failed for destination 'state-changed' - trying to recover. Cause: The messaging entity 'sb://[MySERVICEBUS].servicebus.windows.net/state-changed' could not be found. TrackingId:d2b442f79e0f44bdb449861ea57155ce_G44, SystemTracker:gateway6, Timestamp:3/22/2017 6:34:37 PM 

javax.jms.JMSException: The messaging entity 'sb://[MySERVICEBUS].servicebus.windows.net/state-changed' could not be found. TrackingId:d2b442f79e0f44bdb449861ea57155ce_G44, SystemTracker:gateway6, Timestamp:3/22/2017 6:34:37 PM 
    at org.apache.qpid.amqp_1_0.jms.impl.TopicSubscriberImpl.createClientReceiver(TopicSubscriberImpl.java:111) ~[qpid-amqp-1-0-client-jms-0.32.jar:0.32] 
    at org.apache.qpid.amqp_1_0.jms.impl.MessageConsumerImpl.<init>(MessageConsumerImpl.java:129) ~[qpid-amqp-1-0-client-jms-0.32.jar:0.32] 
    at org.apache.qpid.amqp_1_0.jms.impl.TopicSubscriberImpl.<init>(TopicSubscriberImpl.java:46) ~[qpid-amqp-1-0-client-jms-0.32.jar:0.32] 
    at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.createDurableSubscriber(SessionImpl.java:544) ~[qpid-amqp-1-0-client-jms-0.32.jar:0.32] 
    at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.createDurableSubscriber(SessionImpl.java:59) ~[qpid-amqp-1-0-client-jms-0.32.jar:0.32] 
    at org.springframework.jms.listener.AbstractMessageListenerContainer.createConsumer(AbstractMessageListenerContainer.java:870) ~[spring-jms-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.createListenerConsumer(AbstractPollingMessageListenerContainer.java:215) ~[spring-jms-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.initResourcesIfNecessary(DefaultMessageListenerContainer.java:1189) ~[spring-jms-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1165) ~[spring-jms-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1158) ~[spring-jms-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1055) ~[spring-jms-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_77] 

Iが稼働し、すべてを試してみて、取得するには、このブログの記事を使用している:http://ramblingstechnical.blogspot.co.uk/p/using-azure-service-bus-with-spring-jms.html

私はトピックにメッセージを追加することができますJmsTemplateとは、Azureのドキュメントで説明されているプレーンな古いJavaのJMSライブラリを使用してメッセージを読むことができます:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-java-how-to-use-jms-api-amqp私は私のトピックが動作し、アクセス可能であることを知っている、それはちょうど春私は間違ったことをしている。

私の構成は次のようになります(編集さユーザー名とパスワードなどを含む)

@Configuration 
public class JmsConfiguration 
{ 

    @Bean 
    public JmsListenerContainerFactory topicJmsListenerContainerFactory() throws NamingException 
    { 
     DefaultJmsListenerContainerFactory returnValue = new DefaultJmsListenerContainerFactory(); 

     Context context = context(); 
     ConnectionFactory cf = connectionFactory(context); 

     returnValue.setConnectionFactory(cf); 
     returnValue.setSubscriptionDurable(Boolean.TRUE); 
     return returnValue; 
    } 

    private Context context() throws NamingException 
    { 
     Hashtable<String, String> env = new Hashtable<String, String>(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.qpid.amqp_1_0.jms.jndi.PropertiesFileInitialContextFactory"); 
     env.put(Context.PROVIDER_URL, "src/main/resources/servicebus.properties"); 
     Context context = new InitialContext(env); 
     return context; 
    } 



    /** 
    * @param context 
    * @return 
    * @throws NamingException 
    */ 
    private ConnectionFactory connectionFactory(Context context) throws NamingException 
    { 
     ConnectionFactory cf = (ConnectionFactory) context.lookup("SBCF"); 
     return cf; 
    } 

} 

servicebus.properties:

# servicebus.properties - sample JNDI configuration 

# Register a ConnectionFactory in JNDI using the form: 
# connectionfactory.[jndi_name] = [ConnectionURL] 
connectionfactory.SBCF=amqps://[USER]:[PASSWORD]@[MYSERVICEBUS] 

# Register some queues in JNDI using the form 
# queue.[jndi_name] = [physical_name] 
# topic.[jndi_name] = [physical_name] 
queue.workflow = workflow 
topic.state-changed = stage-changed 

そして最後に、私のリスナークラス:誰であれば

@Component 
public class TestListener 
{ 
    Logger logger = LoggerFactory.getLogger(LoggingWorkflowEventHandler.class); 

    @JmsListener(destination = "state-changed", containerFactory = "topicJmsListenerContainerFactory", subscription = "reverb") 
    public void onMessage(String message) 
    { 
     logger.info("Received message from topic: {}", message); 
    } 
} 

私はこれまでいくつかの指針に感謝しています。

+0

セブに役立ちますどのようなあなたは手に入れましたか?あなたの設定コードによると、 'env.put(Context.PROVIDER_URL、" src/main/resources/servicebus.properties ");というコードの' servicebus.properties'ファイルは実行中にロードされていないようです。これをチェックし、 'classes'ルートパスの相対パスに変更してください。 –

+0

同じ設定が他のコンポーネントで使用されていて、うまく動作しているようです。私はその設定を使ってトピックにメッセージを送ることができます、それは動作しないリスナだけです。 –

答えて

0

エラーメッセージは、宛先の名前が見つからないことを示します(メッセージエンティティが見つかりません)。あなたはこのような特定の方法でAzureのあなたのサブスクリプションの名前を指示する必要があり 注:お使いの場合には

<TopicName>/Subscriptions/<SubscriptionName> 

state-changed/Subscriptions/reverb 

希望

乾杯

関連する問題