JMS客户为何只能同步接收消息而不能异步?

javahui 2003-07-15 11:35:50
代码如下:
发送消息正常。但是接收消息不能收到已经发送的消息,而只能接受con.start()之后发送的消息。我开一个程序接收,然后再开同一个程序发送,接收窗口显示正确。但是如果不开接收窗口,发送的消息都到那里去了?如何获得已经发送的消息?
我使用的是J2EE 1.3服务器。

public static void main(String[] args)
{
try
{ InitialContext context = new InitialContext()
TopicConnectionFactory factory = (TopicConnectionFactory)context.lookup("MyJMSFactory");
Topic orderTopic = (Topic)context.lookup("MyJMSTopic");
TopicConnection con = factory.createTopicConnection();

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

if(args.length>0&&args[0].equalsIgnoreCase("send"))
{
TopicPublisher publisher = session.createPublisher(orderTopic);
TextMessage message = session.createTextMessage();
message.setText("Hello world! i am a jms client.");
publisher.publish(message);
System.out.println("send jms message ok!");
}
else if(args.length>0&&args[0].equalsIgnoreCase("get"))
{
TopicSubscriber topicSubscriber = session.createSubscriber(orderTopic);
topicSubscriber.setMessageListener(new Application1());
System.out.println("start listen...");
con.start();
try {
Thread.sleep(30000);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("listen ok!");
}

con.close();

System.exit(0);

}
catch(Exception e)
{
e.printStackTrace();
}



}
...全文
387 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
javahui 2003-07-16
  • 打赏
  • 举报
回复
哦,明白了
Carlson Wang 2003-07-15
  • 打赏
  • 举报
回复
但是你用队列QUEUE就是异步的
Carlson Wang 2003-07-15
  • 打赏
  • 举报
回复
JMS Topic就是这样的,它是广播式的,就像收音机前的听众,你没听到这个节目就过去了,他不会替你保存下来,想想这样也是合理的啊。
teafang 2003-07-15
  • 打赏
  • 举报
回复
也可以在创建连接工厂的时候设置clientid(容器里创建connectionfactory的时候设定)
这种我没用过
teafang 2003-07-15
  • 打赏
  • 举报
回复
ClientID 只是标识不同的订阅者 只要订阅了同一主题的订阅者都会收到这个主题的消息 如果想收不同的消息就订阅不同的主题
javahui 2003-07-15
  • 打赏
  • 举报
回复
我现在使用session .createDurableSubscriber(topic, clientID);进行了持久性消息订阅;
但是发现订阅之后会收到所有的发到同一topic的所有消息,不管con.setClientID(clientID)中的clientID是多少。
就是说我先用session .createDurableSubscriber(myTopic,"1");进行订阅;然后用con.setClientID("1") con.setClientID("2") con.setClientID("3")发三次消息到myTopic。然后这三个消息使用clientID="1"都能收到。
ClientID对订阅起作用,对发送消息起什么作用呢? 请问这样有问题吗?


teafang 2003-07-15
  • 打赏
  • 举报
回复
String clientID = "qq";
con.setClientID(clientID); //保证clientID不回出现重复
TopicSession session = con.createTopicSession(false, ACKNOWLEDGE_TYPE);
TopicSubscriber topicSubscriber = session .createDurableSubscriber(topic, clientID);
topicSubscriber.setMessageListener(this);

这样就行了
biggie 2003-07-15
  • 打赏
  • 举报
回复
EJB 2.0 中的message Driven Bean 是异步,也就是说,jms 客户机可以发送消息而不必等待回应。当 jms 客户机发送消息时,它并不等待回应。它执行发送操作,然后继续执行下一条指令。消息可能最终转发到一个或许多个客户机,这些客户机都不需要作出回应

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧