HornetQ Native APIでsendしてるのにreceiveできない場合
ソース
public static void main(String[] args) throws Exception { ServerLocator serverLocator = null; ClientSessionFactory factory = null; ClientSession session = null; HashMap<String, Object> map = new HashMap<>(); map.put("host", "localhost"); map.put("port", 5445); TransportConfiguration configuration = new TransportConfiguration(NettyConnectorFactory.class.getName(), map); serverLocator = HornetQClient.createServerLocatorWithoutHA(configuration); factory = serverLocator.createSessionFactory(); session = factory.createSession(false, false, false); session.start(); ClientMessage message = session.createMessage(false); final String queueName = "jms.queue.ExampleQueue"; ClientProducer producer = session.createProducer(queueName); for (int i = 0; i < 100; i++) { message.getBodyBuffer().clear(); message.getBodyBuffer().writeString("new message sent at " + new Date()); producer.send(message); } ClientConsumer consumer = session.createConsumer(queueName); System.out.println(consumer.receive(1000)); session.close(); factory.close(); serverLocator.close(); }
100メッセージをsendしているのに、その直後のreceiveでメッセージが取れずnullが表示されます。
原因
コミットしてない
session = factory.createSession(false, false, false);
- xa - whether the session support XA transaction semantic or not
- autoCommitSends - true to automatically commit message sends, false to commit manually
- autoCommitAcks - true to automatically commit message acknowledgement, false to commit manually
対策
ということなので、第二引数と第三引数をtrueにするとオートコミットになって解決する。
session = factory.createSession(false, true, true);
もしくは、send後に、session.commit()を呼ぶ。
session.commit();