我有一个非常简单的场景,涉及应用程序服务器(Glassfish)中的数据库和JMS.场景很简单:
1. an EJB inserts a row in the database and sends a message.
2. when the message is delivered with an MDB, the row is read and updated.
Run Code Online (Sandbox Code Playgroud)
问题是有时在数据库中提交插入之前传递消息.如果我们考虑2阶段提交协议,这实际上是可以理解的:
1. prepare JMS
2. prepare database
3. commit JMS
4. ( tiny little gap where message can be delivered before insert has been committed)
5. commit database
Run Code Online (Sandbox Code Playgroud)
我和其他人讨论过这个问题,但答案总是如此:"奇怪,它应该开箱即用".
我的问题是:
以下是关于我对问题的理解的更多细节:
只有在按此顺序处理参与者时才存在此计时问题.如果2PC以相反的顺序(数据库优先,然后是消息代理)处理参与者应该没问题.这个问题是随机发生的,但完全可以重现.
我发现无法在Glassfish文档中控制JTA,JCA和JPA规范中分布式事务中参与者的顺序.我们可以假设它们将在使用它们时按照顺序登记在分布式事务中,但是使用诸如JPA之类的ORM,很难知道何时刷新数据以及何时真正使用数据库连接.任何的想法?
我正在创建一个Java应用程序,它需要JVM之间的主从通信,可能驻留在同一台物理机器上.将在Java EE应用程序服务器(即JBoss)内部运行一个"主"服务器,该服务器将"从"客户端连接到它并动态注册自己进行通信(即主服务器将不知道该服务器的IP地址/端口奴隶因此无法提前配置).主服务器充当控制器,它将向从站执行工作,并且从站将定期响应通知,因此将进行双向通信.
我最初想的是基于RPC的系统,其中每一方都是服务器,但它可能变得复杂,所以我更喜欢一种机制,其中有一个打开的套接字,它们来回交谈.
我正在寻找一种低延迟的通信机制,其中消息主要是原始类型,因此不需要严格的序列化.这是我看过的:
有没有我缺少的技术?
编辑:还看了看:
从性能角度理解JMS我遇到了一些麻烦.我们在应用程序中有这么简单的代码:
QueueConnection connection = null;
QueueSession session = null;
QueueSender sender = null;
TextMessage msg = null;
try {
// The JNDIHelper uses InitialContext to look up things
QueueConnectionFactory qcf = JNDIHelper.lookupFactory();
Queue destQueue = JNDIHelper.lookupQueue();
// These objects are created for every message, which is quite slow
connection = qcf.createQueueConnection();
session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
sender = session.createSender(destQueue);
// This is the actual message
msg = session.createTextMessage(xmlMsg);
sender.setTimeToLive(0);
sender.send(msg);
}
finally {
// Close all objects again
JMSUtilities.safeClose(sender);
JMSUtilities.safeClose(session);
JMSUtilities.safeClose(connection); …Run Code Online (Sandbox Code Playgroud) 有两个程序:订阅者和发布者...订阅者能够将消息放入主题并且消息成功发送.当我在浏览器上检查activemq服务器时,它显示1 msg排队.但是当我运行消费者代码时,它没有收到消息
这是生产者代码:
import javax.jms.*;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class producer {
private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start();
// JMS messages are sent and received using a Session. We will
// create here a non-transactional session object. If you want
// to use transactions you should set the first parameter to 'true'
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("testt"); …Run Code Online (Sandbox Code Playgroud) 死信队列和退出队列有什么区别?
在WebSphere MQ术语和应用程序服务器方面.
所有J2EE/JEE应用程序服务器都有一个MQ提供程序它们是否也有一个死信队列的构造,或者是特定于WebSphere MQ的东西?
我对退出队列的理解如下:
如果MQ在指定次数的尝试后无法将消息传递到目标,则会将消息移至后退队列.
我对死信队列没有清楚的了解.
感谢任何帮助.
在JMS中,很容易发现连接是否丢失,发生异常.但是我怎么知道连接是否再次存在?
场景:我使用JMS与我的服务器通信.现在我的连接断开(服务器关闭),这导致异常.到现在为止还挺好.如果服务器再次启动并重新建立连接,我该如何知道?
我没有看到任何能够提供此类信息的听众.
我有一个组件将消息发送到队列以由另一个系统处理.它还应该每隔一段时间发布一个关于工作状态的主题.我可以使用相同的JmsTemplate用于发送到队列并发布到主题吗?
我在ActiveMQ中创建了一个新主题,不过当我从JmsTemplate发送一条消息时,一个带有主题名称的新队列会被发送的消息创建(而不是将数据发送到实际主题),我在这里做错了什么?
这是我的配置:
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory" />
<property name="exceptionListener" ref="jmsExceptionListener" />
<property name="sessionCacheSize" value="100" />
</bean>
<!-- JmsTemplate Definition -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory" />
</bean>
<bean id="messageFacade" class="org.foo.MessageFacadeJms">
<property name="jmsTemplate" ref="jmsTemplate" />
</bean>
Run Code Online (Sandbox Code Playgroud)
MessageFacadeJms是我用来发送队列消息的类(它可以工作),我还可以用它来发布一个主题吗?
我可以使用它来同时进行队列发送和主题发布吗?:
jmsTemplate.convertAndSend("TOPIC_NAME" /* or queue name */, message);
Run Code Online (Sandbox Code Playgroud) 我需要开发一个接受订单并返回确认的系统.订单可能来自java或非Java客户端.
不确定是否要使用Web服务实现或JMS.
有什么建议 ...
这个问题是因为我碰到一些提到(如本),有关使用邮件软件如ZeroMQ 非常久远的Redis,但我不断听到的Redis本身使用的通讯系统.因此,如果Redis与其他消息传递系统一起使用,那么当它作为消息传递系统使用时,它是否意味着Redis有一些严重的缺陷?
虽然我很清楚使用Redis进行缓存和发布/发布,但目前尚不清楚是否可以使用Redis 代替完整的消息系统,如JMS,AMQP或ZeroMQ.
仅仅依靠标准兼容性方面而只关注功能/特性,Redis是否为消息传递系统所需的所有消息传递模式/模型提供支持?
我所说的消息传递模式是:
如果是,那么Redis似乎同时解决了两个(可能更多)方面:缓存和消息传递.
我在由Java/Java EE服务器支持的Web应用程序的上下文中查看此内容.我不是从概念验证的角度来看这个,而是从大规模的软件开发角度来看.
Edit1:
用户:791406问了一个有效的问题:
"谁在乎redis是否支持这些模式; redis是否能满足您的SLA和QoS需求?"
我认为最好将这个细节作为问题的一部分,而不是在评论部分.
我目前的需求与SLA和QOS关系不大,更多的是选择我的工作(消息)工具,即使我的需求在未来(合理地)增长,我也可以使用.我首先从简单化的要求开始,我们都知道需求往往会增长.和NO,我不是在寻找一个工具,做这一切.我只是想知道Redis是否满足消息系统的预期要求,如ActiveMQ/RabbitMQ.当然,如果我的SLA/QOS需要极端/偏心,我需要一个特殊的工具来满足这一要求.例如:在某些情况下,由于特定的SLA要求,可以通过RabbitMQ选择ZeroMQ.我不是在谈论这种特殊要求.我专注于平均企业要求.
我害怕(基于我的一点理解)尽管redis可以用作当今我的消息传递需求的基本工具,但它可能是未来真正的消息传递工作的错误工具.我有使用ActiveMQ/RabbitMQ等消息传递系统的经验,并且知道它们可以用于简单到(合理)复杂的消息传递需求.
编辑2:
redis网站提到"Redis经常被用作消息服务器"但是如何实现消息传递模式并不清楚.
Salvatore sanfilippo提到Redis用户倾向于将其用作数据库,消息传递总线或缓存.它在多大程度上可以用作"消息传递总线"尚不清楚.
当我试图找出redis不支持的JMS的消息传递要求时,我遇到了Redis支持但JMS不支持的东西:模式匹配订阅,即客户端可以订阅glob样式模式以接收发送到的所有消息与给定模式匹配的通道名称.
结论:
我决定使用JMS来满足我的消息传递需求,并使用Redis进行缓存.
是不是Apache Kafka另一个实现JMS?
我JMS+AMQ在我的应用程序中使用,并迁移到Apache Kafka.我是否需要更改所有JMS代码?
jms ×10
java ×6
java-ee ×2
amqp ×1
apache-kafka ×1
database ×1
ibm-mq ×1
jmstemplate ×1
master-slave ×1
messaging ×1
migration ×1
redis ×1
rmi ×1
rpc ×1
spring ×1
web-services ×1
weblogic ×1