有没有办法运行只能在本地检测到的环回JMS适配器?
我不知道如果我的术语是正确的,但我想ActiveMQ代理仅是从代理运行在同一台机器可接.
据我所知,Java NIO是一个帮助创建事件驱动应用程序的API.使用选择器通知您的应用程序通过SocketChannel接收的任何数据.JMS(Java消息传递服务)是用于在客户端之间发送/接收消息的消息传递框架.
JMS是Java NIO API的抽象吗?
异步JMS如何工作?我在下面的示例代码:
public class JmsAdapter implements MessageListener, ExceptionListener
{
private ConnectionFactory connFactory = null;
private Connection conn = null;
private Session session = null;
public void receiveMessages()
{
try
{
this.session = this.conn.createSession(true, Session.SESSION_TRANSACTED);
this.conn.setExceptionListener(this);
Destination destination = this.session.createQueue("SOME_QUEUE_NAME");
this.consumer = this.session.createConsumer(destination);
this.consumer.setMessageListener(this);
this.conn.start();
}
catch (JMSException e)
{
//Handle JMS Exceptions Here
}
}
@Override
public void onMessage(Message message)
{
try
{
//Do Message Processing Here
//Message sucessfully processed... Go ahead and commit the transaction.
this.session.commit();
}
catch(SomeApplicationException e)
{ …Run Code Online (Sandbox Code Playgroud) 我需要向/从存储在单个JMS服务器上的不同主题发送/接收消息.
我想JmsTemplate用于发送和MessageListenerContainer注册异步侦听器.
我的配置如下所示:
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">xxx</prop>
<prop key="java.naming.provider.url">yyy</prop>
</props>
</property>
</bean>
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref ="jndiTemplate"/>
<property name="jndiName" value="TopicConnectionFactory"/>
</bean>
<bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<constructor-arg ref="connectionFactory"/>
</bean>
<bean id="tosJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="singleConnectionFactory"/>
<property name="destinationResolver" ref="destinationResolver"/>
<property name="pubSubDomain" value="true"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
据我所知singleConnectionFactory,返回总是相同的连接实例,有助于减少每次jmsTemplate需要(例如)发送/接收消息时创建和关闭连接的开销(就像使用法线时一样ConnectionFactory).
我的第一个问题是:如果我创建了多个jmsTemplate(s),他们是否可以共享一个参考singleConnectionFactory?或者,他们要接受不同的情况下,每个(singleConnectionFactory1,singleConnectionFactory2,等)?
阅读API SingleConnectionFactory,我发现了这个:
请注意,Spring的消息侦听器容器支持
Connection在每个侦听器容器实例中使用共享.SingleConnectionFactory组合使用对于跨多个侦听器容器共享单个JMS连接非常有意义.
这听起来对我来说有点神秘.据我所知,每个只能注册一个Listener MessageListenerContainer,所以我不明白连接的共享程度.
假设我要注册N个监听器:我需要重复N次这样的事情:
<bean
class="org.springframework.jms.listener.SimpleMessageListenerContainer"> …Run Code Online (Sandbox Code Playgroud) 我创建了一个连接到WebLogic队列的同步QueueReceiver.
doStuff() {
ctx = new InitialContext();
qconFactory = (QueueConnectionFactory) ctx.lookup(CONNECTION_FACTORY);
queue = (Queue) ctx.lookup(outputFromOrcSyncQueue);
queueConnection = qconFactory.createQueueConnection();
queueSession = queueConnection.createQueueSession(true, -1);
queueReceiver = queueSession.createReceiver(queue);
Message message = queueReceiver.receive();
...
}
Run Code Online (Sandbox Code Playgroud)
true在queueSession创建中,这是因为连接工厂是事务处理的.如果我创建一个no transacted queueSession(通过put false),结果是queueReceiver似乎忽略了receive()通过该doStuff方法的方法(使用相同的行为receive(timeout),它不会在经过之前等待).
我还必须在我的连接工厂(WebLogic连接工厂的配置中的客户端选项卡)上启用同步消费者的预取模式.
我的问题是接收器没有读取发送到队列的任何消息.
我可以在WebLogic控制台上看到我的消息,我甚至可以看到我的queueReceiver正在侦听队列,但是queueReceiver似乎忽略了它们.
替代方法我试过的方法:
send()和之前的生产者会议close()谢谢.
Glassfish EJB在以下情况下抛出异常(第二次查找失败)
定时服务 - > JMS队列侦听器 - >第一个EJB - >第二个EJB
但如果Queue被删除它的工作正常.
定时服务 - >第一个EJB - >第二个EJB
注意:它们都位于同一空间的同一服务器上.
Timer Service运行30秒并发JMS Message送到队列@EJB@EJB(有些如何查找失败).定时器类
@Stateless
public class MyTimer {
public static final Logger logger = Logger.getLogger(MyTimer.class);
public MyTimer() {
}
@Schedule(second="*/30", minute="*",hour="*", persistent=false)
private void scheduledTimeout(final Timer t) {
logger.warn("********************* MyTimer scheduledTimeout called ********************************");
MyMessageSender sender = new MyMessageSender();
sender.sendMessage(" /////////////// Here is …Run Code Online (Sandbox Code Playgroud) 当前,我已经使用标准JMS API(仅适用于javax.jms.*类)实现了非SSL安全客户端。当提供特定的产品JAR和正确的类名时,它可以连接到任何JMS服务器。
有没有办法通过SSL连接功能实现这种通用的(独立于供应商的)JMS客户端?
我的研究并不成功-我发现了几个使用SSL实现JMS的示例(例如Novell JMS,ActiveMQ),但是它们都不能避免直接在代码中使用特定于供应商的类,并且实现方式也大不相同。
如何使用队列中的特定标头消息.我正在使用camel activemq.
routebuilder:
.....
from("activemq:Q1").
.setHeader("myHeader",xpath(...))
.to("activemq:Q2")
.....
Run Code Online (Sandbox Code Playgroud)
我尝试使用那些在另一个类中具有特定标题的消息.
....
ConsumerTemplate consumerTemplate = camelContext.createConsumerTemplate();
Exchange exchange = consumerTemplate.receive("activemq:Q2",10000);
String body = exchange.getIn().getBody(String.class);
String customvalue = exchange.getIn().getHeader("myHeader", String.class);
.....
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得myHeader = 123的那些消息.
根据http://docs.oracle.com/javaee/6/api/javax/jms/Message.html#acknowledge()
客户端可以在消费每条消息时分别对其进行确认,也可以选择将消息确认为应用程序定义的组(通过在组中最后收到的消息上调用确认来完成,从而确认会话消耗的所有消息。 )
如何在ActiveMQ中做到这一点?我无法使其工作。
jms ×10
java ×6
java-ee ×3
apache-camel ×1
ejb-3.0 ×1
glassfish ×1
loopback ×1
nio ×1
performance ×1
spring ×1
spring-jms ×1
ssl ×1
timer ×1
weblogic ×1