Java 无法将Spring服务注入akka服务
我有Spring服务,实际上是actor,它收到了信息,但我不能将它传递给另一个Spring服务,因为注入失败Java 无法将Spring服务注入akka服务,java,spring,jsf,akka,akka-persistence,Java,Spring,Jsf,Akka,Akka Persistence,我有Spring服务,实际上是actor,它收到了信息,但我不能将它传递给另一个Spring服务,因为注入失败 @Service("mailContainer") @Scope("prototype") @Component public class MailContainer extends UntypedActor { private final LoggingAdapter LOG = Logging.getLogger(getContext().system(), this);
@Service("mailContainer")
@Scope("prototype")
@Component
public class MailContainer extends UntypedActor {
private final LoggingAdapter LOG = Logging.getLogger(getContext().system(), this);
private Mail value;
private List<Mail> mailList = new ArrayList<Mail>();
private Integer size;
@Autowired
@Qualifier("springService")
private SpringService springService;
//@Autowired
public void setSpringService(SpringService springService) {
this.springService = springService;
}
public MailContainer(Mail value) {
this.value = value;
}
@Override
public void onReceive(Object message) throws Exception {
// LOG.debug("+ MailContainer message: {} ", message);
if (message instanceof Mail) {
value = (Mail) message;
System.out.println("MailContainer get message with id " + value.getId());
System.out.println("With time " + value.getDateSend());
//getSender().tell(value, getSelf()); //heta uxarkum
//this.saveIt(value);
springService.add(value);
}
}
因此,我如何注入另一个Spring服务????基于我们的讨论,我认为这是由于您创建MailContainer actor的方式。您没有使用SpringExtProvider,而是直接使用Props.create。这意味着Spring没有机会对您的新参与者执行依赖注入 尝试更改此代码:
@Override
public void preStart() throws Exception {
System.out.println("Mail collector preStart: {} ");
getContext().actorOf(Props.create(MailContainer.class, result), "one");
}
要像这样使用SpringExtProvider,请执行以下操作:
@Override
public void preStart() throws Exception {
System.out.println("Mail collector preStart: {} ");
getContext().actorOf(SpringExtProvider.get(getContext().system()).props("mailContainer"), "one");
}
这样,您就要求Spring扩展创建新的actor并注入任何必需的依赖项。您是如何创建MailContainer actor的?请显示执行actorOf()方法的代码。您需要通过扩展创建MailContainer,以确保依赖项注入按要求执行。在需要创建actor时,我希望类似于
getContext().actorOf(SpringExtProvider.get(actorSystem.props)(“MailContainer”)
。Spring不会自动为您创建actor Actors创建了成功的Spring或不使用Spring,问题是当我想只注入Spring服务时,它不是基于actor的,它是失败的,例如,我想从上一个actor将数据传递到Spring服务并保存到db。在tomcat下,Autowire inject不工作创建MailContainer actor的方式对于依赖项注入的工作非常重要-如何创建MailContainer actor的实例?我在你的帖子里没有看到这方面的代码。还有,当它失败时,会出现什么异常?下面是以前的actor@Override public void preStart()引发异常{System.out.println(“邮件收集器preStart:{}”);getContext().actorOf(Props.create(MailContainer.class,result),“one”);}的代码。通过这些更改,我看到了另一个错误,你们能看一下这个简单的项目吗?这是一个链接,在tomcat下运行,它是maven项目,您得到的错误是什么?查看Mailcollector类的代码,您有以下行getContext().actorOf(SpringExtProvider.get(getContext().system()).props(MailContainer.class.getSimpleName()),“one”)代码>-您需要在此处使用Springbean的名称,例如“mailContainer”,而不是mailContainer.class.getSimpleName()。也许这就是问题所在。是的,在这之后我又出现了一个错误[error][08/13/2014 14:31:09.388][AkkaJavaSpring-akka.actor.default-dispatcher-6][akka://AkkaJavaSpring/user/mailCollector/one]没有为作用域“session”注册作用域,当创建Springbean session时,没有区别,相同的错误..暂时可以从SpringService中删除@Scope注释,使其成为一个单例,看看是否有效?好的。。据我所知,如果我使用Spring,那么所有与参与者相关的操作都应该通过Spring进行,因为Akka应该是中间件,我将输入数据传输给参与者,并在最后输出数据。
@Override
public void preStart() throws Exception {
System.out.println("Mail collector preStart: {} ");
getContext().actorOf(Props.create(MailContainer.class, result), "one");
}
@Override
public void preStart() throws Exception {
System.out.println("Mail collector preStart: {} ");
getContext().actorOf(SpringExtProvider.get(getContext().system()).props("mailContainer"), "one");
}