gpt4 book ai didi

java - 通过 JMS 聊天。如何链接组件? ( Wicket 口、activemq、j2ee)

转载 作者:行者123 更新时间:2023-11-29 09:01:06 31 4
gpt4 key购买 nike

我有一些架构问题。我开发了一个在 glassfish appserver 上运行的 wicket web 应用程序,有一些 ejb 模块等。为了创建聊天面板,我想使用某种 JMS,例如 Apache ActiveMQ 来避免连续轮询。我制作了两种处理程序 SenderReceiver。它们都有ConnectionFactory、Connecton、Session。聊天面板代表聊天室,每个聊天室是一个主题。 (当您打开一个带有选择的“房间”的聊天面板时,您在逻辑上订阅了给定的主题。)面板实现了 MessageListener 接口(interface),因此面板是 Receiver 对象中消费者的监听器。

因此面板将消息发送到其 Sender 对象中的主题,并通过其 Receiver 对象收听它们。 (是的,每个面板都有一个 Sender 和一个 Receiver 对象)

这样就有 2 个连接/面板,根本没有人关心关闭这些连接。 :(

我认为这不是使用 activemq 的好方法。我需要一些建议来实现这个功能。请问各位高手是怎么操作的?或者我必须去哪个方向?

architecture

(ps,AMQ 已经完全独立运行)

发件人,

public class Sender {

private String user = ActiveMQConnection.DEFAULT_USER;
private String password = ActiveMQConnection.DEFAULT_PASSWORD;
private String url = "failover://(tcp://0.0.0.0:61616)?randomize=false";

private Destination destination;
private Connection connection = null;
private Session session = null;
private ActiveMQConnectionFactory connectionFactory;
private MessageProducer producer;

public Sender(String topicId) {
try {
connectionFactory = new ActiveMQConnectionFactory(user, password, url);
connectionFactory.setDispatchAsync(false);

connection = connectionFactory.createTopicConnection(user, password);
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic(topicId);

producer = session.createProducer(destination);
} catch (JMSException ex) {
Logger.getLogger(Sender.class.getName()).log(Level.SEVERE, null, ex);
System.out.println(ex.toString());
}
}

public void sendMessage(String message) {
try {
BytesMessage message = session.createBytesMessage();
message.setLongProperty("text", message);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
producer.send(destination, message);
} catch (JMSException ex) {
Logger.getLogger(Sender.class.getName()).log(Level.SEVERE, null, ex);
}
}

public void close() {
try {
producer.close();
session.close();
connection.close();
} catch (JMSException ex) {
Logger.getLogger(Sender.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

接收者,

public class Receiver {
private String url = "failover://(tcp://0.0.0.0:61616)?randomize=false";

private ActiveMQConnectionFactory connectionFactory;
private Connection connection;
private Session session = null;
private Topic destination = null;
private TopicSubscriber consumer;
private IdGenerator clientIdGenerator = new IdGenerator();

public Receiver(String topicId, MessageListener listener) {
try {
connectionFactory = new ActiveMQConnectionFactory(url);
connectionFactory.setDispatchAsync(false);

connection = connectionFactory.createTopicConnection();
connection.setClientID(clientIdGenerator.generateId());
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

destination = session.createTopic(topicId);
consumer = session.createDurableSubscriber(destination, "subscriber");
consumer.setMessageListener(listener);
} catch (JMSException ex) {
Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
}
}

public void close() {
try {
consumer.close();
session.close();
connection.close();
} catch (JMSException ex) {
onException(ex);
Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
}
}

}

最佳答案

To create chat panel i would like to use some kind of JMS, for example Apache ActiveMQ to avoid continuous polling.

您描述的设置仍然需要连续轮询!您的聊天面板是服务器端 Wicket 组件。您仍然需要从那些服务器端 Wicket 组件获取聊天数据到客户端(浏览器),这需要通过 Javascript 进行连续轮询。您可以实现自己的 Wicket 行为来完全做到这一点,但它仍然在进行轮询。

如果您想完全避免连续轮询,则必须使用 WebSockets。 Wicket 有一个用于支持 websocket 的实验模块 (https://cwiki.apache.org/confluence/display/WICKET/Wicket+Native+WebSockets)。但是,websocket 不适用于旧版浏览器。

关于java - 通过 JMS 聊天。如何链接组件? ( Wicket 口、activemq、j2ee),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371441/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com