我之前没有任何使用*MQ的经验,而且我希望通常能够构建有关JMS和消息队列的知识.这样,我想知道我是应该从ActiveMQ开始,还是只是"忽略"它,然后开始自学阿波罗.Apollo是否像ActiveMQ一样功能齐全?它是否实现了JMS 2.0(我看到ActiveMQ卡在1.1中)?我会遗漏一些非常重要的东西吗?
另外,Kafka与这两种解决方案相比如何?
我正在尝试Greeter在Wildfly 8.2内部运行的EJB上注入给定类型()的对象.但是,部署始终会失败并显示消息
Unsatisfied dependencies for type Greeter with qualifiers @Default
Run Code Online (Sandbox Code Playgroud)
我试图用注释GreeterImpl和注入点注释,@Default但这也没有用.我在这里错过了什么吗?
我的Greeter界面:
public interface Greeter {
public void sayHi();
}
Run Code Online (Sandbox Code Playgroud)
我的GreeterImpl班级(唯一实施的班级Greeter):
public class GreeterImpl implements Greeter {
private static final Logger LOGGER = LoggerFactory.getLogger(GreeterImpl.class);
@Override
public void sayHi() {
LOGGER.info("Hi!");
}
}
Run Code Online (Sandbox Code Playgroud)
我的ScheduledGreeterEJB:
@Stateless
public class ScheduledGreeter {
@Inject
private Greeter greeter;
@Schedule(second = "*/15", minute = "*", hour = "*")
public void sayHi() {
greeter.sayHi(); …Run Code Online (Sandbox Code Playgroud) 我在AWS上设置了一个带有两个节点的RabbitMQ集群,并按此处所述启用了HA .然后,我将Elastic Load Balancer映射5672到实例的5672端口,并对实例的15672端口(HTTP管理端口)进行定期运行状况检查.然后,我启动了两个监听器(每个节点一个),每个监听器有4个消费者,并指向spring.rabbitmq.host负载均衡器的DNS.但是,我定期收到以下错误:
[E] [2015-03-14 23:13:23,890] [pool-4-thread-9 ] [CachingConnectionFactory ] [ ] Channel shutdown: connection error
[E] [2015-03-14 23:13:23,891] [pool-4-thread-9 ] [CachingConnectionFactory ] [ ] Channel shutdown: connection error
[E] [2015-03-14 23:13:23,891] [pool-4-thread-9 ] [CachingConnectionFactory ] [ ] Channel shutdown: connection error
[E] [2015-03-14 23:13:23,891] [pool-4-thread-9 ] [CachingConnectionFactory ] [ ] Channel shutdown: connection error
[W] [2015-03-14 23:13:24,758] [impleAsyncTaskExecutor-5] [SimpleMessageListenerContainer ] [ ] Consumer raised exception, processing can restart …Run Code Online (Sandbox Code Playgroud) 我有一个非常基本的JAX-RS服务(BookService下面的类),它允许创建类型的实体Book(也在下面).POST有效载荷
{
"acquisitionDate": 1418849700000,
"name": "Funny Title",
"numberOfPages": 100
}
Run Code Online (Sandbox Code Playgroud)
成功地坚持Book并返回201 CREATED.但是,id在有效负载上包含具有任何非空值的属性会触发org.hibernate.PersistentObjectException消息detached entity passed to persist.我理解这意味着什么,并且id在创建对象时包含有效负载(在这种情况下)是没有意义的.但是,我宁愿防止这个异常一直向上冒泡,并400 BAD REQUEST在这种情况下向我的用户呈现(或者,至少完全忽略该属性).但是,有两个主要问题:
create是一个EJBTransactionRolledbackException,我必须一直爬到堆栈跟踪中以发现根本原因;org.hibernate.PersistentObjectException- 我正在部署到使用Hibernate的Wildfly,但我想保持我的代码可移植,所以我真的不想捕获这个特定的异常.据我了解,有两种可能的解决方案:
book.setId(null)之前使用bookRepo.create(book).这将忽略id属性携带值并继续执行请求的事实.book.getId() != null类似的内容IllegalArgumentException映射到400状态代码.似乎是更好的解决方案.但是,来自其他框架(例如Django Rest Framework)我真的更喜欢这个由框架本身来处理......我的问题是,是否有任何内置的方法来实现这种行为我可能不见了?
这是BookService班级:
@Stateless
@Path("/books")
public class BookService {
@Inject
private BookRepo …Run Code Online (Sandbox Code Playgroud) 我使用Spring AMQP设置不同的服务之间的远程调用,描述在这里。然而,当我reply-timeout在我的配置上设置 a时,第一个请求总是失败,因为声明队列、交换和绑定所花费的时间超过了超时:
RabbitAdmin 组件可以在启动时声明交换、队列和绑定。它通过 ConnectionListener 懒惰地执行此操作,因此如果代理在启动时不存在,则无关紧要。第一次使用连接(例如通过发送消息)时,侦听器将被触发并应用管理功能。
有什么方法可以在启动时急切地进行声明,而不是在第一个发布事件上进行声明,以防止第一个请求总是失败?
java ×2
java-ee ×2
spring-amqp ×2
amazon-ec2 ×1
apache-kafka ×1
apollo ×1
cdi ×1
jax-rs ×1
jms ×1
jpa ×1
rabbitmq ×1
spring ×1