gpt4 book ai didi

java - JMS连接应该什么时候开始?在它自己的线程中?

转载 作者:行者123 更新时间:2023-12-01 10:24:48 24 4
gpt4 key购买 nike

我有一个与 WildFly 服务器通信的 Java Swing GUI 客户端。

standalone-full.xml

<jms-queue name="goReceiveFmSvrQueue">
<entry name="java:/jboss/exported/jms/goReceiveFmSvrQueue"/>
<durable>true</durable>
</jms-queue>
<jms-queue name="goSendToSvrQueue">
<entry name="java:jboss/exported/jms/goSendToSvrQueue"/>
<durable>true</durable>
</jms-queue>

我的客户端有一个 Runnable MsgCenterSend 类。它实例化MsgCenterSend。然后调用 msgCenter.run() 启动连接。然后使用msgCenter.send()发送消息。 msgCenter.stop() 在客户端关闭时关闭它。

这有意义吗?

或者客户端是否应该在每次需要发送消息时创建一个连接、 session 、目的地和生产者?如果确实如此,是否应该在单独的线程中完成?

public class MsgCenterSend implements Runnable {
private Connection connection = null;
private MessageProducer msgProducer = null;
private Session session = null;

public void run() {
Context ctx = new InitialContext(/*connection propoerties*/);
HornetQJMSConnectionFactory jmsConnectionFactory = (HornetQJMSConnectionFactory) ctx.lookup("jms/RemoteConnectionFactory");
this.connection = jmsConnectionFactory.createConnection("jmsuser", "jmsuser@123");
this.session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination sendToDestination = (Destination) ctx.lookup("jms/goSendToSvrQueue");
this.msgProducer = this.session.createProducer(sendToDestination);
this.connection.start();
}

public boolean sendMsg (/*parameters*/) {
ObjectMessage message = this.session.createObjectMessage();
// set MessageObject and Properties
this.msgProducer.send(message);
}

public void stop ()
this.connection.stop();
}
}
}

客户端在退出时使用 stop()。

现在我的 MessageBean 看起来像:

@MessageDriven(  
activationConfig ={
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="maxSession",propertyValue="1"),
@ActivationConfigProperty(propertyName="destination", propertyValue="jms/goSendToSvrQueue")
})
public class GoMsgBean implements MessageListener {
@ApplicationScoped
@Inject
JMSContext jmsCtx;
//This is queue client listens to. Server sends replies to it.
@Resource(name = "java:jboss/exported/jms/goReceiveFmSvrQueue")
private Queue svrSendQueue;


public GoMsgBean () {
}

@PostConstruct
public void myInit () {
System.out.println("XXXXXXXXXX Post Construct - GoMsgBean XXXXXXXXXX");
}
@PreDestroy
public void myDestroy () {
System.out.println("XXXXXXXXXX Post Destroy - logger XXXXXXXXXX");
}

public void onMessage(Message msg) {
System.out.println("XXXXXXXXXX MessageBean received a Message XXXXXXXXX");
}
}

最佳答案

即使很少见,我也没有看到保持连接打开的问题,除非您有严重的资源限制,否则消息传递协议(protocol)通常足够轻量级,只需保持打开状态而不必担心连接/断开/重新连接。 ActiveMQ 的文档正是这么说的,虽然我找不到每个连接的内存开销,但它并不多。还有服务器端配置可以帮助管理大量消息,但同样,我并不担心它。

ActiveMQ 的一个缺点是它不支持真正的集群,因此如果您确实要处理数十或数百个连接,那么您就会遇到问题。

最后,您需要在端进行性能分析,以确保应用程序与服务器一起运行。

关于java - JMS连接应该什么时候开始?在它自己的线程中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35400297/

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