Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JMS发送和接收同步_Java_Jpa_Jms - Fatal编程技术网

Java JMS发送和接收同步

Java JMS发送和接收同步,java,jpa,jms,Java,Jpa,Jms,我有一个关于JMS消息发送和接收同步的最佳模式的问题 我有一个C++客户端,通过JAX-RS(REST)在HTTP上与J2EE服务器进行对话。在服务器端,我有两个EJB—一个用于资源操作,另一个用于会话状态跟踪(@Singleton)。当服务器上的某些内容被更改、创建或删除时,我需要通知客户端。所以我采取了这个方法: 1-当客户端连接并登录时,会话bean创建临时jms队列(非事务性),代码如下: connection = connectionFactory.createConnection()

我有一个关于JMS消息发送和接收同步的最佳模式的问题

我有一个C++客户端,通过JAX-RS(REST)在HTTP上与J2EE服务器进行对话。在服务器端,我有两个EJB—一个用于资源操作,另一个用于会话状态跟踪(@Singleton)。当服务器上的某些内容被更改、创建或删除时,我需要通知客户端。所以我采取了这个方法:

1-当客户端连接并登录时,会话bean创建临时jms队列(非事务性),代码如下:

connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
connection.start();
producer = session.createProducer(queue);
consumer = session.createConsumer(queue);
2-客户端调用“侦听器”REST资源,该资源调用:

public void listen() {
    ...
    consumer.recv(timeout);
    ...
}
并阻止,直到收到消息或超时过期

3-当我在资源bean中做一些更改时,它会调用

public void update(...) {
    em.update(...);
    producer.send(session.createMessage(CHANGE_NOTIFY_MESSAGE));
}
4-“侦听器”资源从JMS获取消息,并将其返回给具有已更改(创建)对象信息的客户端,然后客户端调用“get”方法来获取已创建或更改的对象

我的问题是,“侦听器”在将更改写入数据库之前获取消息(我使用的是JPA),所以当客户端请求创建或更改的对象时,这个对象还不存在,或者有旧信息

如何修改我的alghoritm,使其仅在更改保存到数据库后收到通知


(提前感谢您的想法)

如前所述,我认为您需要使会话具有事务性。例如:

// do the operation
em.getTransaction().begin();
em.update(p); 
em.getTransaction().commit();

// now you can send 
producer.send(session.createMessage(CHANGE_NOTIFY_MESSAGE));

我认为您需要使会话具有事务性,并为您的JPA db连接使用XA数据源。默认情况下,更新方法在事务中运行,因此数据库更改和消息发送将一起提交。您需要XA,因为您要在一个tx中组合两个不同的资源(数据库和队列)。