2

リモート マシン (JDK 1.6.0_30) で Glassfish 3.1.2 サーバーを実行しています。次のコードは、Java SE 環境で実行され、JNDI ルックアップを使用して JMS に接続するスタンドアロン クライアントです。クライアントはパブリッシャーであると同時にサブスクライバーでもあります。

次のように JMS 接続プールとトピックを作成しました。

./asadmin create-jms-resource --restype javax.jms.ConnectionFactory jms/TopicConnectionFactory
./asadmin create-jms-resource --restype javax.jms.Topic jms/TopicUpdate

このクライアントの 2 つのインスタンスを開始します。メッセージは配信されたようですが、エラーはありませんが、メッセージはサブスクライバーに届きません...

私が間違っていることは何ですか?

どんな助けでも大歓迎です - 事前に感謝します!

public class JMS implements MessageListener {

    private TopicConnectionFactory factory;
    private TopicConnection connection;
    private Topic topic;

    private void subscribe() {
        try {
            System.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.6");
            System.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
            InitialContext ctx = new InitialContext();
            factory = (TopicConnectionFactory)ctx.lookup("jms/TopicConnectionFactory");
            topic = (Topic)ctx.lookup("jms/TopicUpdate");
            connection = factory.createTopicConnection();
            TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
            TopicSubscriber subscriber = session.createSubscriber(topic);
            subscriber.setMessageListener(this);
            connection.start();
            while(true) {
                Thread.sleep(5000);
                sendMessage();
            }
        } catch (InterruptedException ex) {
            Logger.getLogger(JMS.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NamingException ex) {
            Logger.getLogger(JMS.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JMSException ex) {
            Logger.getLogger(JMS.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void sendMessage() {
        try {
            TopicSession session = connection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
            TopicPublisher publisher = session.createPublisher(topic);
            TextMessage message = session.createTextMessage();
            message.setText("Message from client.");
            publisher.send(message);
            session.close();
            System.out.println("Message sent.");
        } catch (JMSException ex) {
            Logger.getLogger(JMS.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void onMessage(Message msg) {
        System.out.println("Message received.");
    }

    public JMS() {
        subscribe();
    }

    public static void main(String[] args) {
        new JMS();
    }

}
4

2 に答える 2

1

セッションを作成するときに最初の引数としてtrueを使用すると、確認応答モードは無視され、トランザクションが実行されたと見なされます。最初の引数をfalseにして試してください。

明確にするために、次のコード行を変更します。

TopicSession session = connection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);

することが :

TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

メッセージ送信メソッド。

于 2012-04-20T10:20:53.763 に答える
0

パブリッシャーとサブスクライバーを異なるものにすることをお勧めします。

Spring JMS テンプレートを使用してサブスクライブする方法のコードを次に示します。

public class MsgReader implements
        SessionAwareMessageListener<Message> {

    @Override
    public void onMessage(Message message, Session session) throws JMSException {
        if (message instanceof TextMessage) {
            try {
                System.out.println(((TextMessage) message).getText());

            } catch (JMSException ex) {
                throw new RuntimeException(ex);
            }
        } else {
            throw new IllegalArgumentException(
                    "Message must be of type TextMessage");
        }
    }
}
  • Spring Bean ファイル。

  • 最後にBeanをロードします。

    public class SpringJMSTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ApplicationContext context = new FileSystemXmlApplicationContext(new String[]{"/resource/consumerBean.xml"});
            }
    }
    
  • これで、コンソールでメッセージの受信が開始されます。

于 2012-04-20T07:32:16.457 に答える